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
@@ -0,0 +1,1578 @@
1
+ # frozen_string_literal: true
2
+
3
+ # = uri/generic.rb
4
+ #
5
+ # Author:: Akira Yamada <akira@ruby-lang.org>
6
+ # License:: You can redistribute it and/or modify it under the same term as Ruby.
7
+ #
8
+ # See Gem::URI for general documentation
9
+ #
10
+
11
+ require_relative 'common'
12
+ autoload :IPSocket, 'socket'
13
+ autoload :IPAddr, 'ipaddr'
14
+
15
+ module Gem::URI
16
+
17
+ #
18
+ # Base class for all Gem::URI classes.
19
+ # Implements generic Gem::URI syntax as per RFC 2396.
20
+ #
21
+ class Generic
22
+ include Gem::URI
23
+
24
+ #
25
+ # A Default port of nil for Gem::URI::Generic.
26
+ #
27
+ DEFAULT_PORT = nil
28
+
29
+ #
30
+ # Returns default port.
31
+ #
32
+ def self.default_port
33
+ self::DEFAULT_PORT
34
+ end
35
+
36
+ #
37
+ # Returns default port.
38
+ #
39
+ def default_port
40
+ self.class.default_port
41
+ end
42
+
43
+ #
44
+ # An Array of the available components for Gem::URI::Generic.
45
+ #
46
+ COMPONENT = [
47
+ :scheme,
48
+ :userinfo, :host, :port, :registry,
49
+ :path, :opaque,
50
+ :query,
51
+ :fragment
52
+ ].freeze
53
+
54
+ #
55
+ # Components of the Gem::URI in the order.
56
+ #
57
+ def self.component
58
+ self::COMPONENT
59
+ end
60
+
61
+ USE_REGISTRY = false # :nodoc:
62
+
63
+ def self.use_registry # :nodoc:
64
+ self::USE_REGISTRY
65
+ end
66
+
67
+ #
68
+ # == Synopsis
69
+ #
70
+ # See ::new.
71
+ #
72
+ # == Description
73
+ #
74
+ # At first, tries to create a new Gem::URI::Generic instance using
75
+ # Gem::URI::Generic::build. But, if exception Gem::URI::InvalidComponentError is raised,
76
+ # then it does Gem::URI::Escape.escape all Gem::URI components and tries again.
77
+ #
78
+ def self.build2(args)
79
+ begin
80
+ return self.build(args)
81
+ rescue InvalidComponentError
82
+ if args.kind_of?(Array)
83
+ return self.build(args.collect{|x|
84
+ if x.is_a?(String)
85
+ Gem::URI::RFC2396_PARSER.escape(x)
86
+ else
87
+ x
88
+ end
89
+ })
90
+ elsif args.kind_of?(Hash)
91
+ tmp = {}
92
+ args.each do |key, value|
93
+ tmp[key] = if value
94
+ Gem::URI::RFC2396_PARSER.escape(value)
95
+ else
96
+ value
97
+ end
98
+ end
99
+ return self.build(tmp)
100
+ end
101
+ end
102
+ end
103
+
104
+ #
105
+ # == Synopsis
106
+ #
107
+ # See ::new.
108
+ #
109
+ # == Description
110
+ #
111
+ # Creates a new Gem::URI::Generic instance from components of Gem::URI::Generic
112
+ # with check. Components are: scheme, userinfo, host, port, registry, path,
113
+ # opaque, query, and fragment. You can provide arguments either by an Array or a Hash.
114
+ # See ::new for hash keys to use or for order of array items.
115
+ #
116
+ def self.build(args)
117
+ if args.kind_of?(Array) &&
118
+ args.size == ::Gem::URI::Generic::COMPONENT.size
119
+ tmp = args.dup
120
+ elsif args.kind_of?(Hash)
121
+ tmp = ::Gem::URI::Generic::COMPONENT.collect do |c|
122
+ if args.include?(c)
123
+ args[c]
124
+ else
125
+ nil
126
+ end
127
+ end
128
+ else
129
+ component = self.class.component rescue ::Gem::URI::Generic::COMPONENT
130
+ raise ArgumentError,
131
+ "expected Array of or Hash of components of #{self.class} (#{component.join(', ')})"
132
+ end
133
+
134
+ tmp << nil
135
+ tmp << true
136
+ return self.new(*tmp)
137
+ end
138
+
139
+ #
140
+ # == Args
141
+ #
142
+ # +scheme+::
143
+ # Protocol scheme, i.e. 'http','ftp','mailto' and so on.
144
+ # +userinfo+::
145
+ # User name and password, i.e. 'sdmitry:bla'.
146
+ # +host+::
147
+ # Server host name.
148
+ # +port+::
149
+ # Server port.
150
+ # +registry+::
151
+ # Registry of naming authorities.
152
+ # +path+::
153
+ # Path on server.
154
+ # +opaque+::
155
+ # Opaque part.
156
+ # +query+::
157
+ # Query data.
158
+ # +fragment+::
159
+ # Part of the Gem::URI after '#' character.
160
+ # +parser+::
161
+ # Parser for internal use [Gem::URI::DEFAULT_PARSER by default].
162
+ # +arg_check+::
163
+ # Check arguments [false by default].
164
+ #
165
+ # == Description
166
+ #
167
+ # Creates a new Gem::URI::Generic instance from ``generic'' components without check.
168
+ #
169
+ def initialize(scheme,
170
+ userinfo, host, port, registry,
171
+ path, opaque,
172
+ query,
173
+ fragment,
174
+ parser = DEFAULT_PARSER,
175
+ arg_check = false)
176
+ @scheme = nil
177
+ @user = nil
178
+ @password = nil
179
+ @host = nil
180
+ @port = nil
181
+ @path = nil
182
+ @query = nil
183
+ @opaque = nil
184
+ @fragment = nil
185
+ @parser = parser == DEFAULT_PARSER ? nil : parser
186
+
187
+ if arg_check
188
+ self.scheme = scheme
189
+ self.userinfo = userinfo
190
+ self.hostname = host
191
+ self.port = port
192
+ self.path = path
193
+ self.query = query
194
+ self.opaque = opaque
195
+ self.fragment = fragment
196
+ else
197
+ self.set_scheme(scheme)
198
+ self.set_userinfo(userinfo)
199
+ self.set_host(host)
200
+ self.set_port(port)
201
+ self.set_path(path)
202
+ self.query = query
203
+ self.set_opaque(opaque)
204
+ self.fragment=(fragment)
205
+ end
206
+ if registry
207
+ raise InvalidURIError,
208
+ "the scheme #{@scheme} does not accept registry part: #{registry} (or bad hostname?)"
209
+ end
210
+
211
+ @scheme&.freeze
212
+ self.set_path('') if !@path && !@opaque # (see RFC2396 Section 5.2)
213
+ self.set_port(self.default_port) if self.default_port && !@port
214
+ end
215
+
216
+ #
217
+ # Returns the scheme component of the Gem::URI.
218
+ #
219
+ # Gem::URI("http://foo/bar/baz").scheme #=> "http"
220
+ #
221
+ attr_reader :scheme
222
+
223
+ # Returns the host component of the Gem::URI.
224
+ #
225
+ # Gem::URI("http://foo/bar/baz").host #=> "foo"
226
+ #
227
+ # It returns nil if no host component exists.
228
+ #
229
+ # Gem::URI("mailto:foo@example.org").host #=> nil
230
+ #
231
+ # The component does not contain the port number.
232
+ #
233
+ # Gem::URI("http://foo:8080/bar/baz").host #=> "foo"
234
+ #
235
+ # Since IPv6 addresses are wrapped with brackets in URIs,
236
+ # this method returns IPv6 addresses wrapped with brackets.
237
+ # This form is not appropriate to pass to socket methods such as TCPSocket.open.
238
+ # If unwrapped host names are required, use the #hostname method.
239
+ #
240
+ # Gem::URI("http://[::1]/bar/baz").host #=> "[::1]"
241
+ # Gem::URI("http://[::1]/bar/baz").hostname #=> "::1"
242
+ #
243
+ attr_reader :host
244
+
245
+ # Returns the port component of the Gem::URI.
246
+ #
247
+ # Gem::URI("http://foo/bar/baz").port #=> 80
248
+ # Gem::URI("http://foo:8080/bar/baz").port #=> 8080
249
+ #
250
+ attr_reader :port
251
+
252
+ def registry # :nodoc:
253
+ nil
254
+ end
255
+
256
+ # Returns the path component of the Gem::URI.
257
+ #
258
+ # Gem::URI("http://foo/bar/baz").path #=> "/bar/baz"
259
+ #
260
+ attr_reader :path
261
+
262
+ # Returns the query component of the Gem::URI.
263
+ #
264
+ # Gem::URI("http://foo/bar/baz?search=FooBar").query #=> "search=FooBar"
265
+ #
266
+ attr_reader :query
267
+
268
+ # Returns the opaque part of the Gem::URI.
269
+ #
270
+ # Gem::URI("mailto:foo@example.org").opaque #=> "foo@example.org"
271
+ # Gem::URI("http://foo/bar/baz").opaque #=> nil
272
+ #
273
+ # The portion of the path that does not make use of the slash '/'.
274
+ # The path typically refers to an absolute path or an opaque part.
275
+ # (See RFC2396 Section 3 and 5.2.)
276
+ #
277
+ attr_reader :opaque
278
+
279
+ # Returns the fragment component of the Gem::URI.
280
+ #
281
+ # Gem::URI("http://foo/bar/baz?search=FooBar#ponies").fragment #=> "ponies"
282
+ #
283
+ attr_reader :fragment
284
+
285
+ # Returns the parser to be used.
286
+ #
287
+ # Unless a Gem::URI::Parser is defined, DEFAULT_PARSER is used.
288
+ #
289
+ def parser
290
+ if !defined?(@parser) || !@parser
291
+ DEFAULT_PARSER
292
+ else
293
+ @parser || DEFAULT_PARSER
294
+ end
295
+ end
296
+
297
+ # Replaces self by other Gem::URI object.
298
+ #
299
+ def replace!(oth)
300
+ if self.class != oth.class
301
+ raise ArgumentError, "expected #{self.class} object"
302
+ end
303
+
304
+ component.each do |c|
305
+ self.__send__("#{c}=", oth.__send__(c))
306
+ end
307
+ end
308
+ private :replace!
309
+
310
+ #
311
+ # Components of the Gem::URI in the order.
312
+ #
313
+ def component
314
+ self.class.component
315
+ end
316
+
317
+ #
318
+ # Checks the scheme +v+ component against the Gem::URI::Parser Regexp for :SCHEME.
319
+ #
320
+ def check_scheme(v)
321
+ if v && parser.regexp[:SCHEME] !~ v
322
+ raise InvalidComponentError,
323
+ "bad component(expected scheme component): #{v}"
324
+ end
325
+
326
+ return true
327
+ end
328
+ private :check_scheme
329
+
330
+ # Protected setter for the scheme component +v+.
331
+ #
332
+ # See also Gem::URI::Generic.scheme=.
333
+ #
334
+ def set_scheme(v)
335
+ @scheme = v&.downcase
336
+ end
337
+ protected :set_scheme
338
+
339
+ #
340
+ # == Args
341
+ #
342
+ # +v+::
343
+ # String
344
+ #
345
+ # == Description
346
+ #
347
+ # Public setter for the scheme component +v+
348
+ # (with validation).
349
+ #
350
+ # See also Gem::URI::Generic.check_scheme.
351
+ #
352
+ # == Usage
353
+ #
354
+ # require 'rubygems/vendor/uri/lib/uri'
355
+ #
356
+ # uri = Gem::URI.parse("http://my.example.com")
357
+ # uri.scheme = "https"
358
+ # uri.to_s #=> "https://my.example.com"
359
+ #
360
+ def scheme=(v)
361
+ check_scheme(v)
362
+ set_scheme(v)
363
+ v
364
+ end
365
+
366
+ #
367
+ # Checks the +user+ and +password+.
368
+ #
369
+ # If +password+ is not provided, then +user+ is
370
+ # split, using Gem::URI::Generic.split_userinfo, to
371
+ # pull +user+ and +password.
372
+ #
373
+ # See also Gem::URI::Generic.check_user, Gem::URI::Generic.check_password.
374
+ #
375
+ def check_userinfo(user, password = nil)
376
+ if !password
377
+ user, password = split_userinfo(user)
378
+ end
379
+ check_user(user)
380
+ check_password(password, user)
381
+
382
+ return true
383
+ end
384
+ private :check_userinfo
385
+
386
+ #
387
+ # Checks the user +v+ component for RFC2396 compliance
388
+ # and against the Gem::URI::Parser Regexp for :USERINFO.
389
+ #
390
+ # Can not have a registry or opaque component defined,
391
+ # with a user component defined.
392
+ #
393
+ def check_user(v)
394
+ if @opaque
395
+ raise InvalidURIError,
396
+ "cannot set user with opaque"
397
+ end
398
+
399
+ return v unless v
400
+
401
+ if parser.regexp[:USERINFO] !~ v
402
+ raise InvalidComponentError,
403
+ "bad component(expected userinfo component or user component): #{v}"
404
+ end
405
+
406
+ return true
407
+ end
408
+ private :check_user
409
+
410
+ #
411
+ # Checks the password +v+ component for RFC2396 compliance
412
+ # and against the Gem::URI::Parser Regexp for :USERINFO.
413
+ #
414
+ # Can not have a registry or opaque component defined,
415
+ # with a user component defined.
416
+ #
417
+ def check_password(v, user = @user)
418
+ if @opaque
419
+ raise InvalidURIError,
420
+ "cannot set password with opaque"
421
+ end
422
+ return v unless v
423
+
424
+ if !user
425
+ raise InvalidURIError,
426
+ "password component depends user component"
427
+ end
428
+
429
+ if parser.regexp[:USERINFO] !~ v
430
+ raise InvalidComponentError,
431
+ "bad password component"
432
+ end
433
+
434
+ return true
435
+ end
436
+ private :check_password
437
+
438
+ #
439
+ # Sets userinfo, argument is string like 'name:pass'.
440
+ #
441
+ def userinfo=(userinfo)
442
+ if userinfo.nil?
443
+ return nil
444
+ end
445
+ check_userinfo(*userinfo)
446
+ set_userinfo(*userinfo)
447
+ # returns userinfo
448
+ end
449
+
450
+ #
451
+ # == Args
452
+ #
453
+ # +v+::
454
+ # String
455
+ #
456
+ # == Description
457
+ #
458
+ # Public setter for the +user+ component
459
+ # (with validation).
460
+ #
461
+ # See also Gem::URI::Generic.check_user.
462
+ #
463
+ # == Usage
464
+ #
465
+ # require 'rubygems/vendor/uri/lib/uri'
466
+ #
467
+ # uri = Gem::URI.parse("http://john:S3nsit1ve@my.example.com")
468
+ # uri.user = "sam"
469
+ # uri.to_s #=> "http://sam:V3ry_S3nsit1ve@my.example.com"
470
+ #
471
+ def user=(user)
472
+ check_user(user)
473
+ set_user(user)
474
+ # returns user
475
+ end
476
+
477
+ #
478
+ # == Args
479
+ #
480
+ # +v+::
481
+ # String
482
+ #
483
+ # == Description
484
+ #
485
+ # Public setter for the +password+ component
486
+ # (with validation).
487
+ #
488
+ # See also Gem::URI::Generic.check_password.
489
+ #
490
+ # == Usage
491
+ #
492
+ # require 'rubygems/vendor/uri/lib/uri'
493
+ #
494
+ # uri = Gem::URI.parse("http://john:S3nsit1ve@my.example.com")
495
+ # uri.password = "V3ry_S3nsit1ve"
496
+ # uri.to_s #=> "http://john:V3ry_S3nsit1ve@my.example.com"
497
+ #
498
+ def password=(password)
499
+ check_password(password)
500
+ set_password(password)
501
+ # returns password
502
+ end
503
+
504
+ # Protected setter for the +user+ component, and +password+ if available
505
+ # (with validation).
506
+ #
507
+ # See also Gem::URI::Generic.userinfo=.
508
+ #
509
+ def set_userinfo(user, password = nil)
510
+ unless password
511
+ user, password = split_userinfo(user)
512
+ end
513
+ @user = user
514
+ @password = password if password
515
+
516
+ [@user, @password]
517
+ end
518
+ protected :set_userinfo
519
+
520
+ # Protected setter for the user component +v+.
521
+ #
522
+ # See also Gem::URI::Generic.user=.
523
+ #
524
+ def set_user(v)
525
+ set_userinfo(v, @password)
526
+ v
527
+ end
528
+ protected :set_user
529
+
530
+ # Protected setter for the password component +v+.
531
+ #
532
+ # See also Gem::URI::Generic.password=.
533
+ #
534
+ def set_password(v)
535
+ @password = v
536
+ # returns v
537
+ end
538
+ protected :set_password
539
+
540
+ # Returns the userinfo +ui+ as <code>[user, password]</code>
541
+ # if properly formatted as 'user:password'.
542
+ def split_userinfo(ui)
543
+ return nil, nil unless ui
544
+ user, password = ui.split(':', 2)
545
+
546
+ return user, password
547
+ end
548
+ private :split_userinfo
549
+
550
+ # Escapes 'user:password' +v+ based on RFC 1738 section 3.1.
551
+ def escape_userpass(v)
552
+ parser.escape(v, /[@:\/]/o) # RFC 1738 section 3.1 #/
553
+ end
554
+ private :escape_userpass
555
+
556
+ # Returns the userinfo, either as 'user' or 'user:password'.
557
+ def userinfo
558
+ if @user.nil?
559
+ nil
560
+ elsif @password.nil?
561
+ @user
562
+ else
563
+ @user + ':' + @password
564
+ end
565
+ end
566
+
567
+ # Returns the user component (without Gem::URI decoding).
568
+ def user
569
+ @user
570
+ end
571
+
572
+ # Returns the password component (without Gem::URI decoding).
573
+ def password
574
+ @password
575
+ end
576
+
577
+ # Returns the user component after Gem::URI decoding.
578
+ def decoded_user
579
+ Gem::URI.decode_uri_component(@user) if @user
580
+ end
581
+
582
+ # Returns the password component after Gem::URI decoding.
583
+ def decoded_password
584
+ Gem::URI.decode_uri_component(@password) if @password
585
+ end
586
+
587
+ #
588
+ # Checks the host +v+ component for RFC2396 compliance
589
+ # and against the Gem::URI::Parser Regexp for :HOST.
590
+ #
591
+ # Can not have a registry or opaque component defined,
592
+ # with a host component defined.
593
+ #
594
+ def check_host(v)
595
+ return v unless v
596
+
597
+ if @opaque
598
+ raise InvalidURIError,
599
+ "cannot set host with registry or opaque"
600
+ elsif parser.regexp[:HOST] !~ v
601
+ raise InvalidComponentError,
602
+ "bad component(expected host component): #{v}"
603
+ end
604
+
605
+ return true
606
+ end
607
+ private :check_host
608
+
609
+ # Protected setter for the host component +v+.
610
+ #
611
+ # See also Gem::URI::Generic.host=.
612
+ #
613
+ def set_host(v)
614
+ @host = v
615
+ end
616
+ protected :set_host
617
+
618
+ #
619
+ # == Args
620
+ #
621
+ # +v+::
622
+ # String
623
+ #
624
+ # == Description
625
+ #
626
+ # Public setter for the host component +v+
627
+ # (with validation).
628
+ #
629
+ # See also Gem::URI::Generic.check_host.
630
+ #
631
+ # == Usage
632
+ #
633
+ # require 'rubygems/vendor/uri/lib/uri'
634
+ #
635
+ # uri = Gem::URI.parse("http://my.example.com")
636
+ # uri.host = "foo.com"
637
+ # uri.to_s #=> "http://foo.com"
638
+ #
639
+ def host=(v)
640
+ check_host(v)
641
+ set_host(v)
642
+ v
643
+ end
644
+
645
+ # Extract the host part of the Gem::URI and unwrap brackets for IPv6 addresses.
646
+ #
647
+ # This method is the same as Gem::URI::Generic#host except
648
+ # brackets for IPv6 (and future IP) addresses are removed.
649
+ #
650
+ # uri = Gem::URI("http://[::1]/bar")
651
+ # uri.hostname #=> "::1"
652
+ # uri.host #=> "[::1]"
653
+ #
654
+ def hostname
655
+ v = self.host
656
+ v&.start_with?('[') && v.end_with?(']') ? v[1..-2] : v
657
+ end
658
+
659
+ # Sets the host part of the Gem::URI as the argument with brackets for IPv6 addresses.
660
+ #
661
+ # This method is the same as Gem::URI::Generic#host= except
662
+ # the argument can be a bare IPv6 address.
663
+ #
664
+ # uri = Gem::URI("http://foo/bar")
665
+ # uri.hostname = "::1"
666
+ # uri.to_s #=> "http://[::1]/bar"
667
+ #
668
+ # If the argument seems to be an IPv6 address,
669
+ # it is wrapped with brackets.
670
+ #
671
+ def hostname=(v)
672
+ v = "[#{v}]" if !(v&.start_with?('[') && v&.end_with?(']')) && v&.index(':')
673
+ self.host = v
674
+ end
675
+
676
+ #
677
+ # Checks the port +v+ component for RFC2396 compliance
678
+ # and against the Gem::URI::Parser Regexp for :PORT.
679
+ #
680
+ # Can not have a registry or opaque component defined,
681
+ # with a port component defined.
682
+ #
683
+ def check_port(v)
684
+ return v unless v
685
+
686
+ if @opaque
687
+ raise InvalidURIError,
688
+ "cannot set port with registry or opaque"
689
+ elsif !v.kind_of?(Integer) && parser.regexp[:PORT] !~ v
690
+ raise InvalidComponentError,
691
+ "bad component(expected port component): #{v.inspect}"
692
+ end
693
+
694
+ return true
695
+ end
696
+ private :check_port
697
+
698
+ # Protected setter for the port component +v+.
699
+ #
700
+ # See also Gem::URI::Generic.port=.
701
+ #
702
+ def set_port(v)
703
+ v = v.empty? ? nil : v.to_i unless !v || v.kind_of?(Integer)
704
+ @port = v
705
+ end
706
+ protected :set_port
707
+
708
+ #
709
+ # == Args
710
+ #
711
+ # +v+::
712
+ # String
713
+ #
714
+ # == Description
715
+ #
716
+ # Public setter for the port component +v+
717
+ # (with validation).
718
+ #
719
+ # See also Gem::URI::Generic.check_port.
720
+ #
721
+ # == Usage
722
+ #
723
+ # require 'rubygems/vendor/uri/lib/uri'
724
+ #
725
+ # uri = Gem::URI.parse("http://my.example.com")
726
+ # uri.port = 8080
727
+ # uri.to_s #=> "http://my.example.com:8080"
728
+ #
729
+ def port=(v)
730
+ check_port(v)
731
+ set_port(v)
732
+ port
733
+ end
734
+
735
+ def check_registry(v) # :nodoc:
736
+ raise InvalidURIError, "cannot set registry"
737
+ end
738
+ private :check_registry
739
+
740
+ def set_registry(v) #:nodoc:
741
+ raise InvalidURIError, "cannot set registry"
742
+ end
743
+ protected :set_registry
744
+
745
+ def registry=(v)
746
+ raise InvalidURIError, "cannot set registry"
747
+ end
748
+
749
+ #
750
+ # Checks the path +v+ component for RFC2396 compliance
751
+ # and against the Gem::URI::Parser Regexp
752
+ # for :ABS_PATH and :REL_PATH.
753
+ #
754
+ # Can not have a opaque component defined,
755
+ # with a path component defined.
756
+ #
757
+ def check_path(v)
758
+ # raise if both hier and opaque are not nil, because:
759
+ # absoluteURI = scheme ":" ( hier_part | opaque_part )
760
+ # hier_part = ( net_path | abs_path ) [ "?" query ]
761
+ if v && @opaque
762
+ raise InvalidURIError,
763
+ "path conflicts with opaque"
764
+ end
765
+
766
+ # If scheme is ftp, path may be relative.
767
+ # See RFC 1738 section 3.2.2, and RFC 2396.
768
+ if @scheme && @scheme != "ftp"
769
+ if v && v != '' && parser.regexp[:ABS_PATH] !~ v
770
+ raise InvalidComponentError,
771
+ "bad component(expected absolute path component): #{v}"
772
+ end
773
+ else
774
+ if v && v != '' && parser.regexp[:ABS_PATH] !~ v &&
775
+ parser.regexp[:REL_PATH] !~ v
776
+ raise InvalidComponentError,
777
+ "bad component(expected relative path component): #{v}"
778
+ end
779
+ end
780
+
781
+ return true
782
+ end
783
+ private :check_path
784
+
785
+ # Protected setter for the path component +v+.
786
+ #
787
+ # See also Gem::URI::Generic.path=.
788
+ #
789
+ def set_path(v)
790
+ @path = v
791
+ end
792
+ protected :set_path
793
+
794
+ #
795
+ # == Args
796
+ #
797
+ # +v+::
798
+ # String
799
+ #
800
+ # == Description
801
+ #
802
+ # Public setter for the path component +v+
803
+ # (with validation).
804
+ #
805
+ # See also Gem::URI::Generic.check_path.
806
+ #
807
+ # == Usage
808
+ #
809
+ # require 'rubygems/vendor/uri/lib/uri'
810
+ #
811
+ # uri = Gem::URI.parse("http://my.example.com/pub/files")
812
+ # uri.path = "/faq/"
813
+ # uri.to_s #=> "http://my.example.com/faq/"
814
+ #
815
+ def path=(v)
816
+ check_path(v)
817
+ set_path(v)
818
+ v
819
+ end
820
+
821
+ #
822
+ # == Args
823
+ #
824
+ # +v+::
825
+ # String
826
+ #
827
+ # == Description
828
+ #
829
+ # Public setter for the query component +v+.
830
+ #
831
+ # == Usage
832
+ #
833
+ # require 'rubygems/vendor/uri/lib/uri'
834
+ #
835
+ # uri = Gem::URI.parse("http://my.example.com/?id=25")
836
+ # uri.query = "id=1"
837
+ # uri.to_s #=> "http://my.example.com/?id=1"
838
+ #
839
+ def query=(v)
840
+ return @query = nil unless v
841
+ raise InvalidURIError, "query conflicts with opaque" if @opaque
842
+
843
+ x = v.to_str
844
+ v = x.dup if x.equal? v
845
+ v.encode!(Encoding::UTF_8) rescue nil
846
+ v.delete!("\t\r\n")
847
+ v.force_encoding(Encoding::ASCII_8BIT)
848
+ raise InvalidURIError, "invalid percent escape: #{$1}" if /(%\H\H)/n.match(v)
849
+ v.gsub!(/(?!%\h\h|[!$-&(-;=?-_a-~])./n.freeze){'%%%02X' % $&.ord}
850
+ v.force_encoding(Encoding::US_ASCII)
851
+ @query = v
852
+ end
853
+
854
+ #
855
+ # Checks the opaque +v+ component for RFC2396 compliance and
856
+ # against the Gem::URI::Parser Regexp for :OPAQUE.
857
+ #
858
+ # Can not have a host, port, user, or path component defined,
859
+ # with an opaque component defined.
860
+ #
861
+ def check_opaque(v)
862
+ return v unless v
863
+
864
+ # raise if both hier and opaque are not nil, because:
865
+ # absoluteURI = scheme ":" ( hier_part | opaque_part )
866
+ # hier_part = ( net_path | abs_path ) [ "?" query ]
867
+ if @host || @port || @user || @path # userinfo = @user + ':' + @password
868
+ raise InvalidURIError,
869
+ "cannot set opaque with host, port, userinfo or path"
870
+ elsif v && parser.regexp[:OPAQUE] !~ v
871
+ raise InvalidComponentError,
872
+ "bad component(expected opaque component): #{v}"
873
+ end
874
+
875
+ return true
876
+ end
877
+ private :check_opaque
878
+
879
+ # Protected setter for the opaque component +v+.
880
+ #
881
+ # See also Gem::URI::Generic.opaque=.
882
+ #
883
+ def set_opaque(v)
884
+ @opaque = v
885
+ end
886
+ protected :set_opaque
887
+
888
+ #
889
+ # == Args
890
+ #
891
+ # +v+::
892
+ # String
893
+ #
894
+ # == Description
895
+ #
896
+ # Public setter for the opaque component +v+
897
+ # (with validation).
898
+ #
899
+ # See also Gem::URI::Generic.check_opaque.
900
+ #
901
+ def opaque=(v)
902
+ check_opaque(v)
903
+ set_opaque(v)
904
+ v
905
+ end
906
+
907
+ #
908
+ # Checks the fragment +v+ component against the Gem::URI::Parser Regexp for :FRAGMENT.
909
+ #
910
+ #
911
+ # == Args
912
+ #
913
+ # +v+::
914
+ # String
915
+ #
916
+ # == Description
917
+ #
918
+ # Public setter for the fragment component +v+
919
+ # (with validation).
920
+ #
921
+ # == Usage
922
+ #
923
+ # require 'rubygems/vendor/uri/lib/uri'
924
+ #
925
+ # uri = Gem::URI.parse("http://my.example.com/?id=25#time=1305212049")
926
+ # uri.fragment = "time=1305212086"
927
+ # uri.to_s #=> "http://my.example.com/?id=25#time=1305212086"
928
+ #
929
+ def fragment=(v)
930
+ return @fragment = nil unless v
931
+
932
+ x = v.to_str
933
+ v = x.dup if x.equal? v
934
+ v.encode!(Encoding::UTF_8) rescue nil
935
+ v.delete!("\t\r\n")
936
+ v.force_encoding(Encoding::ASCII_8BIT)
937
+ v.gsub!(/(?!%\h\h|[!-~])./n){'%%%02X' % $&.ord}
938
+ v.force_encoding(Encoding::US_ASCII)
939
+ @fragment = v
940
+ end
941
+
942
+ #
943
+ # Returns true if Gem::URI is hierarchical.
944
+ #
945
+ # == Description
946
+ #
947
+ # Gem::URI has components listed in order of decreasing significance from left to right,
948
+ # see RFC3986 https://www.rfc-editor.org/rfc/rfc3986 1.2.3.
949
+ #
950
+ # == Usage
951
+ #
952
+ # require 'rubygems/vendor/uri/lib/uri'
953
+ #
954
+ # uri = Gem::URI.parse("http://my.example.com/")
955
+ # uri.hierarchical?
956
+ # #=> true
957
+ # uri = Gem::URI.parse("mailto:joe@example.com")
958
+ # uri.hierarchical?
959
+ # #=> false
960
+ #
961
+ def hierarchical?
962
+ if @path
963
+ true
964
+ else
965
+ false
966
+ end
967
+ end
968
+
969
+ #
970
+ # Returns true if Gem::URI has a scheme (e.g. http:// or https://) specified.
971
+ #
972
+ def absolute?
973
+ if @scheme
974
+ true
975
+ else
976
+ false
977
+ end
978
+ end
979
+ alias absolute absolute?
980
+
981
+ #
982
+ # Returns true if Gem::URI does not have a scheme (e.g. http:// or https://) specified.
983
+ #
984
+ def relative?
985
+ !absolute?
986
+ end
987
+
988
+ #
989
+ # Returns an Array of the path split on '/'.
990
+ #
991
+ def split_path(path)
992
+ path.split("/", -1)
993
+ end
994
+ private :split_path
995
+
996
+ #
997
+ # Merges a base path +base+, with relative path +rel+,
998
+ # returns a modified base path.
999
+ #
1000
+ def merge_path(base, rel)
1001
+
1002
+ # RFC2396, Section 5.2, 5)
1003
+ # RFC2396, Section 5.2, 6)
1004
+ base_path = split_path(base)
1005
+ rel_path = split_path(rel)
1006
+
1007
+ # RFC2396, Section 5.2, 6), a)
1008
+ base_path << '' if base_path.last == '..'
1009
+ while i = base_path.index('..')
1010
+ base_path.slice!(i - 1, 2)
1011
+ end
1012
+
1013
+ if (first = rel_path.first) and first.empty?
1014
+ base_path.clear
1015
+ rel_path.shift
1016
+ end
1017
+
1018
+ # RFC2396, Section 5.2, 6), c)
1019
+ # RFC2396, Section 5.2, 6), d)
1020
+ rel_path.push('') if rel_path.last == '.' || rel_path.last == '..'
1021
+ rel_path.delete('.')
1022
+
1023
+ # RFC2396, Section 5.2, 6), e)
1024
+ tmp = []
1025
+ rel_path.each do |x|
1026
+ if x == '..' &&
1027
+ !(tmp.empty? || tmp.last == '..')
1028
+ tmp.pop
1029
+ else
1030
+ tmp << x
1031
+ end
1032
+ end
1033
+
1034
+ add_trailer_slash = !tmp.empty?
1035
+ if base_path.empty?
1036
+ base_path = [''] # keep '/' for root directory
1037
+ elsif add_trailer_slash
1038
+ base_path.pop
1039
+ end
1040
+ while x = tmp.shift
1041
+ if x == '..'
1042
+ # RFC2396, Section 4
1043
+ # a .. or . in an absolute path has no special meaning
1044
+ base_path.pop if base_path.size > 1
1045
+ else
1046
+ # if x == '..'
1047
+ # valid absolute (but abnormal) path "/../..."
1048
+ # else
1049
+ # valid absolute path
1050
+ # end
1051
+ base_path << x
1052
+ tmp.each {|t| base_path << t}
1053
+ add_trailer_slash = false
1054
+ break
1055
+ end
1056
+ end
1057
+ base_path.push('') if add_trailer_slash
1058
+
1059
+ return base_path.join('/')
1060
+ end
1061
+ private :merge_path
1062
+
1063
+ #
1064
+ # == Args
1065
+ #
1066
+ # +oth+::
1067
+ # Gem::URI or String
1068
+ #
1069
+ # == Description
1070
+ #
1071
+ # Destructive form of #merge.
1072
+ #
1073
+ # == Usage
1074
+ #
1075
+ # require 'rubygems/vendor/uri/lib/uri'
1076
+ #
1077
+ # uri = Gem::URI.parse("http://my.example.com")
1078
+ # uri.merge!("/main.rbx?page=1")
1079
+ # uri.to_s # => "http://my.example.com/main.rbx?page=1"
1080
+ #
1081
+ def merge!(oth)
1082
+ t = merge(oth)
1083
+ if self == t
1084
+ nil
1085
+ else
1086
+ replace!(t)
1087
+ self
1088
+ end
1089
+ end
1090
+
1091
+ #
1092
+ # == Args
1093
+ #
1094
+ # +oth+::
1095
+ # Gem::URI or String
1096
+ #
1097
+ # == Description
1098
+ #
1099
+ # Merges two URIs.
1100
+ #
1101
+ # == Usage
1102
+ #
1103
+ # require 'rubygems/vendor/uri/lib/uri'
1104
+ #
1105
+ # uri = Gem::URI.parse("http://my.example.com")
1106
+ # uri.merge("/main.rbx?page=1")
1107
+ # # => "http://my.example.com/main.rbx?page=1"
1108
+ #
1109
+ def merge(oth)
1110
+ rel = parser.__send__(:convert_to_uri, oth)
1111
+
1112
+ if rel.absolute?
1113
+ #raise BadURIError, "both Gem::URI are absolute" if absolute?
1114
+ # hmm... should return oth for usability?
1115
+ return rel
1116
+ end
1117
+
1118
+ unless self.absolute?
1119
+ raise BadURIError, "both Gem::URI are relative"
1120
+ end
1121
+
1122
+ base = self.dup
1123
+
1124
+ authority = rel.userinfo || rel.host || rel.port
1125
+
1126
+ # RFC2396, Section 5.2, 2)
1127
+ if (rel.path.nil? || rel.path.empty?) && !authority && !rel.query
1128
+ base.fragment=(rel.fragment) if rel.fragment
1129
+ return base
1130
+ end
1131
+
1132
+ base.query = nil
1133
+ base.fragment=(nil)
1134
+
1135
+ # RFC2396, Section 5.2, 4)
1136
+ if !authority
1137
+ base.set_path(merge_path(base.path, rel.path)) if base.path && rel.path
1138
+ else
1139
+ # RFC2396, Section 5.2, 4)
1140
+ base.set_path(rel.path) if rel.path
1141
+ end
1142
+
1143
+ # RFC2396, Section 5.2, 7)
1144
+ base.set_userinfo(rel.userinfo) if rel.userinfo
1145
+ base.set_host(rel.host) if rel.host
1146
+ base.set_port(rel.port) if rel.port
1147
+ base.query = rel.query if rel.query
1148
+ base.fragment=(rel.fragment) if rel.fragment
1149
+
1150
+ return base
1151
+ end # merge
1152
+ alias + merge
1153
+
1154
+ # :stopdoc:
1155
+ def route_from_path(src, dst)
1156
+ case dst
1157
+ when src
1158
+ # RFC2396, Section 4.2
1159
+ return ''
1160
+ when %r{(?:\A|/)\.\.?(?:/|\z)}
1161
+ # dst has abnormal absolute path,
1162
+ # like "/./", "/../", "/x/../", ...
1163
+ return dst.dup
1164
+ end
1165
+
1166
+ src_path = src.scan(%r{[^/]*/})
1167
+ dst_path = dst.scan(%r{[^/]*/?})
1168
+
1169
+ # discard same parts
1170
+ while !dst_path.empty? && dst_path.first == src_path.first
1171
+ src_path.shift
1172
+ dst_path.shift
1173
+ end
1174
+
1175
+ tmp = dst_path.join
1176
+
1177
+ # calculate
1178
+ if src_path.empty?
1179
+ if tmp.empty?
1180
+ return './'
1181
+ elsif dst_path.first.include?(':') # (see RFC2396 Section 5)
1182
+ return './' + tmp
1183
+ else
1184
+ return tmp
1185
+ end
1186
+ end
1187
+
1188
+ return '../' * src_path.size + tmp
1189
+ end
1190
+ private :route_from_path
1191
+ # :startdoc:
1192
+
1193
+ # :stopdoc:
1194
+ def route_from0(oth)
1195
+ oth = parser.__send__(:convert_to_uri, oth)
1196
+ if self.relative?
1197
+ raise BadURIError,
1198
+ "relative Gem::URI: #{self}"
1199
+ end
1200
+ if oth.relative?
1201
+ raise BadURIError,
1202
+ "relative Gem::URI: #{oth}"
1203
+ end
1204
+
1205
+ if self.scheme != oth.scheme
1206
+ return self, self.dup
1207
+ end
1208
+ rel = Gem::URI::Generic.new(nil, # it is relative Gem::URI
1209
+ self.userinfo, self.host, self.port,
1210
+ nil, self.path, self.opaque,
1211
+ self.query, self.fragment, parser)
1212
+
1213
+ if rel.userinfo != oth.userinfo ||
1214
+ rel.host.to_s.downcase != oth.host.to_s.downcase ||
1215
+ rel.port != oth.port
1216
+
1217
+ if self.userinfo.nil? && self.host.nil?
1218
+ return self, self.dup
1219
+ end
1220
+
1221
+ rel.set_port(nil) if rel.port == oth.default_port
1222
+ return rel, rel
1223
+ end
1224
+ rel.set_userinfo(nil)
1225
+ rel.set_host(nil)
1226
+ rel.set_port(nil)
1227
+
1228
+ if rel.path && rel.path == oth.path
1229
+ rel.set_path('')
1230
+ rel.query = nil if rel.query == oth.query
1231
+ return rel, rel
1232
+ elsif rel.opaque && rel.opaque == oth.opaque
1233
+ rel.set_opaque('')
1234
+ rel.query = nil if rel.query == oth.query
1235
+ return rel, rel
1236
+ end
1237
+
1238
+ # you can modify `rel', but cannot `oth'.
1239
+ return oth, rel
1240
+ end
1241
+ private :route_from0
1242
+ # :startdoc:
1243
+
1244
+ #
1245
+ # == Args
1246
+ #
1247
+ # +oth+::
1248
+ # Gem::URI or String
1249
+ #
1250
+ # == Description
1251
+ #
1252
+ # Calculates relative path from oth to self.
1253
+ #
1254
+ # == Usage
1255
+ #
1256
+ # require 'rubygems/vendor/uri/lib/uri'
1257
+ #
1258
+ # uri = Gem::URI.parse('http://my.example.com/main.rbx?page=1')
1259
+ # uri.route_from('http://my.example.com')
1260
+ # #=> #<Gem::URI::Generic /main.rbx?page=1>
1261
+ #
1262
+ def route_from(oth)
1263
+ # you can modify `rel', but cannot `oth'.
1264
+ begin
1265
+ oth, rel = route_from0(oth)
1266
+ rescue
1267
+ raise $!.class, $!.message
1268
+ end
1269
+ if oth == rel
1270
+ return rel
1271
+ end
1272
+
1273
+ rel.set_path(route_from_path(oth.path, self.path))
1274
+ if rel.path == './' && self.query
1275
+ # "./?foo" -> "?foo"
1276
+ rel.set_path('')
1277
+ end
1278
+
1279
+ return rel
1280
+ end
1281
+
1282
+ alias - route_from
1283
+
1284
+ #
1285
+ # == Args
1286
+ #
1287
+ # +oth+::
1288
+ # Gem::URI or String
1289
+ #
1290
+ # == Description
1291
+ #
1292
+ # Calculates relative path to oth from self.
1293
+ #
1294
+ # == Usage
1295
+ #
1296
+ # require 'rubygems/vendor/uri/lib/uri'
1297
+ #
1298
+ # uri = Gem::URI.parse('http://my.example.com')
1299
+ # uri.route_to('http://my.example.com/main.rbx?page=1')
1300
+ # #=> #<Gem::URI::Generic /main.rbx?page=1>
1301
+ #
1302
+ def route_to(oth)
1303
+ parser.__send__(:convert_to_uri, oth).route_from(self)
1304
+ end
1305
+
1306
+ #
1307
+ # Returns normalized Gem::URI.
1308
+ #
1309
+ # require 'rubygems/vendor/uri/lib/uri'
1310
+ #
1311
+ # Gem::URI("HTTP://my.EXAMPLE.com").normalize
1312
+ # #=> #<Gem::URI::HTTP http://my.example.com/>
1313
+ #
1314
+ # Normalization here means:
1315
+ #
1316
+ # * scheme and host are converted to lowercase,
1317
+ # * an empty path component is set to "/".
1318
+ #
1319
+ def normalize
1320
+ uri = dup
1321
+ uri.normalize!
1322
+ uri
1323
+ end
1324
+
1325
+ #
1326
+ # Destructive version of #normalize.
1327
+ #
1328
+ def normalize!
1329
+ if path&.empty?
1330
+ set_path('/')
1331
+ end
1332
+ if scheme && scheme != scheme.downcase
1333
+ set_scheme(self.scheme.downcase)
1334
+ end
1335
+ if host && host != host.downcase
1336
+ set_host(self.host.downcase)
1337
+ end
1338
+ end
1339
+
1340
+ #
1341
+ # Constructs String from Gem::URI.
1342
+ #
1343
+ def to_s
1344
+ str = ''.dup
1345
+ if @scheme
1346
+ str << @scheme
1347
+ str << ':'
1348
+ end
1349
+
1350
+ if @opaque
1351
+ str << @opaque
1352
+ else
1353
+ if @host || %w[file postgres].include?(@scheme)
1354
+ str << '//'
1355
+ end
1356
+ if self.userinfo
1357
+ str << self.userinfo
1358
+ str << '@'
1359
+ end
1360
+ if @host
1361
+ str << @host
1362
+ end
1363
+ if @port && @port != self.default_port
1364
+ str << ':'
1365
+ str << @port.to_s
1366
+ end
1367
+ if (@host || @port) && !@path.empty? && !@path.start_with?('/')
1368
+ str << '/'
1369
+ end
1370
+ str << @path
1371
+ if @query
1372
+ str << '?'
1373
+ str << @query
1374
+ end
1375
+ end
1376
+ if @fragment
1377
+ str << '#'
1378
+ str << @fragment
1379
+ end
1380
+ str
1381
+ end
1382
+ alias to_str to_s
1383
+
1384
+ #
1385
+ # Compares two URIs.
1386
+ #
1387
+ def ==(oth)
1388
+ if self.class == oth.class
1389
+ self.normalize.component_ary == oth.normalize.component_ary
1390
+ else
1391
+ false
1392
+ end
1393
+ end
1394
+
1395
+ def hash
1396
+ self.component_ary.hash
1397
+ end
1398
+
1399
+ def eql?(oth)
1400
+ self.class == oth.class &&
1401
+ parser == oth.parser &&
1402
+ self.component_ary.eql?(oth.component_ary)
1403
+ end
1404
+
1405
+ # Returns an Array of the components defined from the COMPONENT Array.
1406
+ def component_ary
1407
+ component.collect do |x|
1408
+ self.__send__(x)
1409
+ end
1410
+ end
1411
+ protected :component_ary
1412
+
1413
+ # == Args
1414
+ #
1415
+ # +components+::
1416
+ # Multiple Symbol arguments defined in Gem::URI::HTTP.
1417
+ #
1418
+ # == Description
1419
+ #
1420
+ # Selects specified components from Gem::URI.
1421
+ #
1422
+ # == Usage
1423
+ #
1424
+ # require 'rubygems/vendor/uri/lib/uri'
1425
+ #
1426
+ # uri = Gem::URI.parse('http://myuser:mypass@my.example.com/test.rbx')
1427
+ # uri.select(:userinfo, :host, :path)
1428
+ # # => ["myuser:mypass", "my.example.com", "/test.rbx"]
1429
+ #
1430
+ def select(*components)
1431
+ components.collect do |c|
1432
+ if component.include?(c)
1433
+ self.__send__(c)
1434
+ else
1435
+ raise ArgumentError,
1436
+ "expected of components of #{self.class} (#{self.class.component.join(', ')})"
1437
+ end
1438
+ end
1439
+ end
1440
+
1441
+ def inspect
1442
+ "#<#{self.class} #{self}>"
1443
+ end
1444
+
1445
+ #
1446
+ # == Args
1447
+ #
1448
+ # +v+::
1449
+ # Gem::URI or String
1450
+ #
1451
+ # == Description
1452
+ #
1453
+ # Attempts to parse other Gem::URI +oth+,
1454
+ # returns [parsed_oth, self].
1455
+ #
1456
+ # == Usage
1457
+ #
1458
+ # require 'rubygems/vendor/uri/lib/uri'
1459
+ #
1460
+ # uri = Gem::URI.parse("http://my.example.com")
1461
+ # uri.coerce("http://foo.com")
1462
+ # #=> [#<Gem::URI::HTTP http://foo.com>, #<Gem::URI::HTTP http://my.example.com>]
1463
+ #
1464
+ def coerce(oth)
1465
+ case oth
1466
+ when String
1467
+ oth = parser.parse(oth)
1468
+ else
1469
+ super
1470
+ end
1471
+
1472
+ return oth, self
1473
+ end
1474
+
1475
+ # Returns a proxy Gem::URI.
1476
+ # The proxy Gem::URI is obtained from environment variables such as http_proxy,
1477
+ # ftp_proxy, no_proxy, etc.
1478
+ # If there is no proper proxy, nil is returned.
1479
+ #
1480
+ # If the optional parameter +env+ is specified, it is used instead of ENV.
1481
+ #
1482
+ # Note that capitalized variables (HTTP_PROXY, FTP_PROXY, NO_PROXY, etc.)
1483
+ # are examined, too.
1484
+ #
1485
+ # But http_proxy and HTTP_PROXY is treated specially under CGI environment.
1486
+ # It's because HTTP_PROXY may be set by Proxy: header.
1487
+ # So HTTP_PROXY is not used.
1488
+ # http_proxy is not used too if the variable is case insensitive.
1489
+ # CGI_HTTP_PROXY can be used instead.
1490
+ def find_proxy(env=ENV)
1491
+ raise BadURIError, "relative Gem::URI: #{self}" if self.relative?
1492
+ name = self.scheme.downcase + '_proxy'
1493
+ proxy_uri = nil
1494
+ if name == 'http_proxy' && env.include?('REQUEST_METHOD') # CGI?
1495
+ # HTTP_PROXY conflicts with *_proxy for proxy settings and
1496
+ # HTTP_* for header information in CGI.
1497
+ # So it should be careful to use it.
1498
+ pairs = env.reject {|k, v| /\Ahttp_proxy\z/i !~ k }
1499
+ case pairs.length
1500
+ when 0 # no proxy setting anyway.
1501
+ proxy_uri = nil
1502
+ when 1
1503
+ k, _ = pairs.shift
1504
+ if k == 'http_proxy' && env[k.upcase] == nil
1505
+ # http_proxy is safe to use because ENV is case sensitive.
1506
+ proxy_uri = env[name]
1507
+ else
1508
+ proxy_uri = nil
1509
+ end
1510
+ else # http_proxy is safe to use because ENV is case sensitive.
1511
+ proxy_uri = env.to_hash[name]
1512
+ end
1513
+ if !proxy_uri
1514
+ # Use CGI_HTTP_PROXY. cf. libwww-perl.
1515
+ proxy_uri = env["CGI_#{name.upcase}"]
1516
+ end
1517
+ elsif name == 'http_proxy'
1518
+ if RUBY_ENGINE == 'jruby' && p_addr = ENV_JAVA['http.proxyHost']
1519
+ p_port = ENV_JAVA['http.proxyPort']
1520
+ if p_user = ENV_JAVA['http.proxyUser']
1521
+ p_pass = ENV_JAVA['http.proxyPass']
1522
+ proxy_uri = "http://#{p_user}:#{p_pass}@#{p_addr}:#{p_port}"
1523
+ else
1524
+ proxy_uri = "http://#{p_addr}:#{p_port}"
1525
+ end
1526
+ else
1527
+ unless proxy_uri = env[name]
1528
+ if proxy_uri = env[name.upcase]
1529
+ warn 'The environment variable HTTP_PROXY is discouraged. Use http_proxy.', uplevel: 1
1530
+ end
1531
+ end
1532
+ end
1533
+ else
1534
+ proxy_uri = env[name] || env[name.upcase]
1535
+ end
1536
+
1537
+ if proxy_uri.nil? || proxy_uri.empty?
1538
+ return nil
1539
+ end
1540
+
1541
+ if self.hostname
1542
+ begin
1543
+ addr = IPSocket.getaddress(self.hostname)
1544
+ return nil if /\A127\.|\A::1\z/ =~ addr
1545
+ rescue SocketError
1546
+ end
1547
+ end
1548
+
1549
+ name = 'no_proxy'
1550
+ if no_proxy = env[name] || env[name.upcase]
1551
+ return nil unless Gem::URI::Generic.use_proxy?(self.hostname, addr, self.port, no_proxy)
1552
+ end
1553
+ Gem::URI.parse(proxy_uri)
1554
+ end
1555
+
1556
+ def self.use_proxy?(hostname, addr, port, no_proxy) # :nodoc:
1557
+ hostname = hostname.downcase
1558
+ dothostname = ".#{hostname}"
1559
+ no_proxy.scan(/([^:,\s]+)(?::(\d+))?/) {|p_host, p_port|
1560
+ if !p_port || port == p_port.to_i
1561
+ if p_host.start_with?('.')
1562
+ return false if hostname.end_with?(p_host.downcase)
1563
+ else
1564
+ return false if dothostname.end_with?(".#{p_host.downcase}")
1565
+ end
1566
+ if addr
1567
+ begin
1568
+ return false if IPAddr.new(p_host).include?(addr)
1569
+ rescue IPAddr::InvalidAddressError
1570
+ next
1571
+ end
1572
+ end
1573
+ end
1574
+ }
1575
+ true
1576
+ end
1577
+ end
1578
+ end