bundler-clone 4.0.15

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 (350) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5670 -0
  3. data/LICENSE.md +22 -0
  4. data/README.md +58 -0
  5. data/bundler.gemspec +46 -0
  6. data/exe/bundle +29 -0
  7. data/exe/bundler +4 -0
  8. data/lib/bundler/.document +1 -0
  9. data/lib/bundler/build_metadata.rb +44 -0
  10. data/lib/bundler/capistrano.rb +4 -0
  11. data/lib/bundler/checksum.rb +270 -0
  12. data/lib/bundler/ci_detector.rb +75 -0
  13. data/lib/bundler/cli/add.rb +62 -0
  14. data/lib/bundler/cli/binstubs.rb +57 -0
  15. data/lib/bundler/cli/cache.rb +32 -0
  16. data/lib/bundler/cli/check.rb +40 -0
  17. data/lib/bundler/cli/clean.rb +25 -0
  18. data/lib/bundler/cli/common.rb +161 -0
  19. data/lib/bundler/cli/config.rb +208 -0
  20. data/lib/bundler/cli/console.rb +47 -0
  21. data/lib/bundler/cli/doctor/diagnose.rb +167 -0
  22. data/lib/bundler/cli/doctor/ssl.rb +249 -0
  23. data/lib/bundler/cli/doctor.rb +33 -0
  24. data/lib/bundler/cli/exec.rb +114 -0
  25. data/lib/bundler/cli/fund.rb +36 -0
  26. data/lib/bundler/cli/gem.rb +493 -0
  27. data/lib/bundler/cli/info.rb +83 -0
  28. data/lib/bundler/cli/init.rb +51 -0
  29. data/lib/bundler/cli/install.rb +127 -0
  30. data/lib/bundler/cli/issue.rb +41 -0
  31. data/lib/bundler/cli/list.rb +97 -0
  32. data/lib/bundler/cli/lock.rb +94 -0
  33. data/lib/bundler/cli/open.rb +29 -0
  34. data/lib/bundler/cli/outdated.rb +337 -0
  35. data/lib/bundler/cli/platform.rb +48 -0
  36. data/lib/bundler/cli/plugin.rb +39 -0
  37. data/lib/bundler/cli/pristine.rb +64 -0
  38. data/lib/bundler/cli/remove.rb +17 -0
  39. data/lib/bundler/cli/show.rb +71 -0
  40. data/lib/bundler/cli/update.rb +125 -0
  41. data/lib/bundler/cli.rb +829 -0
  42. data/lib/bundler/compact_index_client/cache.rb +96 -0
  43. data/lib/bundler/compact_index_client/cache_file.rb +148 -0
  44. data/lib/bundler/compact_index_client/parser.rb +87 -0
  45. data/lib/bundler/compact_index_client/updater.rb +105 -0
  46. data/lib/bundler/compact_index_client.rb +92 -0
  47. data/lib/bundler/constants.rb +14 -0
  48. data/lib/bundler/current_ruby.rb +94 -0
  49. data/lib/bundler/definition.rb +1304 -0
  50. data/lib/bundler/dependency.rb +151 -0
  51. data/lib/bundler/deployment.rb +6 -0
  52. data/lib/bundler/deprecate.rb +44 -0
  53. data/lib/bundler/digest.rb +71 -0
  54. data/lib/bundler/dsl.rb +642 -0
  55. data/lib/bundler/endpoint_specification.rb +184 -0
  56. data/lib/bundler/env.rb +148 -0
  57. data/lib/bundler/environment_preserver.rb +69 -0
  58. data/lib/bundler/errors.rb +277 -0
  59. data/lib/bundler/feature_flag.rb +20 -0
  60. data/lib/bundler/fetcher/base.rb +55 -0
  61. data/lib/bundler/fetcher/compact_index.rb +133 -0
  62. data/lib/bundler/fetcher/dependency.rb +85 -0
  63. data/lib/bundler/fetcher/downloader.rb +116 -0
  64. data/lib/bundler/fetcher/gem_remote_fetcher.rb +24 -0
  65. data/lib/bundler/fetcher/index.rb +25 -0
  66. data/lib/bundler/fetcher.rb +365 -0
  67. data/lib/bundler/force_platform.rb +16 -0
  68. data/lib/bundler/friendly_errors.rb +127 -0
  69. data/lib/bundler/gem_helper.rb +237 -0
  70. data/lib/bundler/gem_tasks.rb +7 -0
  71. data/lib/bundler/gem_version_promoter.rb +147 -0
  72. data/lib/bundler/index.rb +203 -0
  73. data/lib/bundler/injector.rb +284 -0
  74. data/lib/bundler/inline.rb +106 -0
  75. data/lib/bundler/installer/gem_installer.rb +88 -0
  76. data/lib/bundler/installer/parallel_installer.rb +280 -0
  77. data/lib/bundler/installer/standalone.rb +113 -0
  78. data/lib/bundler/installer.rb +241 -0
  79. data/lib/bundler/lazy_specification.rb +270 -0
  80. data/lib/bundler/lockfile_generator.rb +119 -0
  81. data/lib/bundler/lockfile_parser.rb +328 -0
  82. data/lib/bundler/man/.document +1 -0
  83. data/lib/bundler/man/bundle-add.1 +79 -0
  84. data/lib/bundler/man/bundle-add.1.ronn +92 -0
  85. data/lib/bundler/man/bundle-binstubs.1 +30 -0
  86. data/lib/bundler/man/bundle-binstubs.1.ronn +42 -0
  87. data/lib/bundler/man/bundle-cache.1 +56 -0
  88. data/lib/bundler/man/bundle-cache.1.ronn +95 -0
  89. data/lib/bundler/man/bundle-check.1 +21 -0
  90. data/lib/bundler/man/bundle-check.1.ronn +26 -0
  91. data/lib/bundler/man/bundle-clean.1 +17 -0
  92. data/lib/bundler/man/bundle-clean.1.ronn +18 -0
  93. data/lib/bundler/man/bundle-config.1 +339 -0
  94. data/lib/bundler/man/bundle-config.1.ronn +455 -0
  95. data/lib/bundler/man/bundle-console.1 +33 -0
  96. data/lib/bundler/man/bundle-console.1.ronn +39 -0
  97. data/lib/bundler/man/bundle-doctor.1 +69 -0
  98. data/lib/bundler/man/bundle-doctor.1.ronn +77 -0
  99. data/lib/bundler/man/bundle-env.1 +9 -0
  100. data/lib/bundler/man/bundle-env.1.ronn +10 -0
  101. data/lib/bundler/man/bundle-exec.1 +104 -0
  102. data/lib/bundler/man/bundle-exec.1.ronn +150 -0
  103. data/lib/bundler/man/bundle-fund.1 +22 -0
  104. data/lib/bundler/man/bundle-fund.1.ronn +25 -0
  105. data/lib/bundler/man/bundle-gem.1 +107 -0
  106. data/lib/bundler/man/bundle-gem.1.ronn +150 -0
  107. data/lib/bundler/man/bundle-help.1 +9 -0
  108. data/lib/bundler/man/bundle-help.1.ronn +12 -0
  109. data/lib/bundler/man/bundle-info.1 +17 -0
  110. data/lib/bundler/man/bundle-info.1.ronn +21 -0
  111. data/lib/bundler/man/bundle-init.1 +20 -0
  112. data/lib/bundler/man/bundle-init.1.ronn +32 -0
  113. data/lib/bundler/man/bundle-install.1 +178 -0
  114. data/lib/bundler/man/bundle-install.1.ronn +314 -0
  115. data/lib/bundler/man/bundle-issue.1 +45 -0
  116. data/lib/bundler/man/bundle-issue.1.ronn +37 -0
  117. data/lib/bundler/man/bundle-licenses.1 +9 -0
  118. data/lib/bundler/man/bundle-licenses.1.ronn +10 -0
  119. data/lib/bundler/man/bundle-list.1 +40 -0
  120. data/lib/bundler/man/bundle-list.1.ronn +41 -0
  121. data/lib/bundler/man/bundle-lock.1 +75 -0
  122. data/lib/bundler/man/bundle-lock.1.ronn +115 -0
  123. data/lib/bundler/man/bundle-open.1 +32 -0
  124. data/lib/bundler/man/bundle-open.1.ronn +28 -0
  125. data/lib/bundler/man/bundle-outdated.1 +106 -0
  126. data/lib/bundler/man/bundle-outdated.1.ronn +117 -0
  127. data/lib/bundler/man/bundle-platform.1 +49 -0
  128. data/lib/bundler/man/bundle-platform.1.ronn +49 -0
  129. data/lib/bundler/man/bundle-plugin.1 +76 -0
  130. data/lib/bundler/man/bundle-plugin.1.ronn +84 -0
  131. data/lib/bundler/man/bundle-pristine.1 +23 -0
  132. data/lib/bundler/man/bundle-pristine.1.ronn +34 -0
  133. data/lib/bundler/man/bundle-remove.1 +15 -0
  134. data/lib/bundler/man/bundle-remove.1.ronn +16 -0
  135. data/lib/bundler/man/bundle-show.1 +16 -0
  136. data/lib/bundler/man/bundle-show.1.ronn +21 -0
  137. data/lib/bundler/man/bundle-update.1 +284 -0
  138. data/lib/bundler/man/bundle-update.1.ronn +367 -0
  139. data/lib/bundler/man/bundle-version.1 +22 -0
  140. data/lib/bundler/man/bundle-version.1.ronn +24 -0
  141. data/lib/bundler/man/bundle.1 +93 -0
  142. data/lib/bundler/man/bundle.1.ronn +107 -0
  143. data/lib/bundler/man/gemfile.5 +503 -0
  144. data/lib/bundler/man/gemfile.5.ronn +586 -0
  145. data/lib/bundler/man/index.txt +31 -0
  146. data/lib/bundler/match_metadata.rb +30 -0
  147. data/lib/bundler/match_platform.rb +42 -0
  148. data/lib/bundler/match_remote_metadata.rb +29 -0
  149. data/lib/bundler/materialization.rb +59 -0
  150. data/lib/bundler/mirror.rb +221 -0
  151. data/lib/bundler/plugin/api/source.rb +330 -0
  152. data/lib/bundler/plugin/api.rb +81 -0
  153. data/lib/bundler/plugin/dsl.rb +53 -0
  154. data/lib/bundler/plugin/events.rb +85 -0
  155. data/lib/bundler/plugin/index.rb +203 -0
  156. data/lib/bundler/plugin/installer/git.rb +34 -0
  157. data/lib/bundler/plugin/installer/path.rb +26 -0
  158. data/lib/bundler/plugin/installer/rubygems.rb +19 -0
  159. data/lib/bundler/plugin/installer.rb +123 -0
  160. data/lib/bundler/plugin/source_list.rb +31 -0
  161. data/lib/bundler/plugin/unloaded_source.rb +25 -0
  162. data/lib/bundler/plugin.rb +387 -0
  163. data/lib/bundler/process_lock.rb +20 -0
  164. data/lib/bundler/remote_specification.rb +126 -0
  165. data/lib/bundler/resolver/base.rb +127 -0
  166. data/lib/bundler/resolver/candidate.rb +85 -0
  167. data/lib/bundler/resolver/incompatibility.rb +15 -0
  168. data/lib/bundler/resolver/package.rb +95 -0
  169. data/lib/bundler/resolver/root.rb +25 -0
  170. data/lib/bundler/resolver/spec_group.rb +74 -0
  171. data/lib/bundler/resolver/strategy.rb +43 -0
  172. data/lib/bundler/resolver.rb +603 -0
  173. data/lib/bundler/retry.rb +92 -0
  174. data/lib/bundler/ruby_dsl.rb +67 -0
  175. data/lib/bundler/ruby_version.rb +135 -0
  176. data/lib/bundler/rubygems_ext.rb +503 -0
  177. data/lib/bundler/rubygems_gem_installer.rb +206 -0
  178. data/lib/bundler/rubygems_integration.rb +456 -0
  179. data/lib/bundler/runtime.rb +331 -0
  180. data/lib/bundler/safe_marshal.rb +31 -0
  181. data/lib/bundler/self_manager.rb +197 -0
  182. data/lib/bundler/settings/validator.rb +86 -0
  183. data/lib/bundler/settings.rb +585 -0
  184. data/lib/bundler/setup.rb +39 -0
  185. data/lib/bundler/shared_helpers.rb +392 -0
  186. data/lib/bundler/source/gemspec.rb +19 -0
  187. data/lib/bundler/source/git/git_proxy.rb +509 -0
  188. data/lib/bundler/source/git.rb +451 -0
  189. data/lib/bundler/source/metadata.rb +67 -0
  190. data/lib/bundler/source/path/installer.rb +53 -0
  191. data/lib/bundler/source/path.rb +256 -0
  192. data/lib/bundler/source/rubygems/remote.rb +86 -0
  193. data/lib/bundler/source/rubygems.rb +606 -0
  194. data/lib/bundler/source/rubygems_aggregate.rb +71 -0
  195. data/lib/bundler/source.rb +120 -0
  196. data/lib/bundler/source_list.rb +240 -0
  197. data/lib/bundler/source_map.rb +72 -0
  198. data/lib/bundler/spec_set.rb +390 -0
  199. data/lib/bundler/stub_specification.rb +147 -0
  200. data/lib/bundler/templates/.document +1 -0
  201. data/lib/bundler/templates/Executable +16 -0
  202. data/lib/bundler/templates/Executable.standalone +14 -0
  203. data/lib/bundler/templates/Gemfile +5 -0
  204. data/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
  205. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +10 -0
  206. data/lib/bundler/templates/newgem/Cargo.toml.tt +13 -0
  207. data/lib/bundler/templates/newgem/Gemfile.tt +24 -0
  208. data/lib/bundler/templates/newgem/LICENSE.txt.tt +21 -0
  209. data/lib/bundler/templates/newgem/README.md.tt +49 -0
  210. data/lib/bundler/templates/newgem/Rakefile.tt +72 -0
  211. data/lib/bundler/templates/newgem/bin/console.tt +11 -0
  212. data/lib/bundler/templates/newgem/bin/setup.tt +8 -0
  213. data/lib/bundler/templates/newgem/circleci/config.yml.tt +37 -0
  214. data/lib/bundler/templates/newgem/exe/newgem.tt +3 -0
  215. data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +22 -0
  216. data/lib/bundler/templates/newgem/ext/newgem/build.rs.tt +5 -0
  217. data/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  218. data/lib/bundler/templates/newgem/ext/newgem/extconf-go.rb.tt +11 -0
  219. data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  220. data/lib/bundler/templates/newgem/ext/newgem/go.mod.tt +5 -0
  221. data/lib/bundler/templates/newgem/ext/newgem/newgem-go.c.tt +2 -0
  222. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +9 -0
  223. data/lib/bundler/templates/newgem/ext/newgem/newgem.go.tt +31 -0
  224. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +6 -0
  225. data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +23 -0
  226. data/lib/bundler/templates/newgem/github/workflows/build-gems.yml.tt +69 -0
  227. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +48 -0
  228. data/lib/bundler/templates/newgem/gitignore.tt +23 -0
  229. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +27 -0
  230. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +9 -0
  231. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +15 -0
  232. data/lib/bundler/templates/newgem/newgem.gemspec.tt +58 -0
  233. data/lib/bundler/templates/newgem/rspec.tt +3 -0
  234. data/lib/bundler/templates/newgem/rubocop.yml.tt +8 -0
  235. data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  236. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +19 -0
  237. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +15 -0
  238. data/lib/bundler/templates/newgem/standard.yml.tt +3 -0
  239. data/lib/bundler/templates/newgem/test/minitest/test_helper.rb.tt +6 -0
  240. data/lib/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +19 -0
  241. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  242. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  243. data/lib/bundler/ui/rg_proxy.rb +19 -0
  244. data/lib/bundler/ui/shell.rb +191 -0
  245. data/lib/bundler/ui/silent.rb +96 -0
  246. data/lib/bundler/ui.rb +9 -0
  247. data/lib/bundler/uri_credentials_filter.rb +43 -0
  248. data/lib/bundler/uri_normalizer.rb +23 -0
  249. data/lib/bundler/vendor/.document +1 -0
  250. data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
  251. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +227 -0
  252. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
  253. data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
  254. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +230 -0
  255. data/lib/bundler/vendor/fileutils/COPYING +56 -0
  256. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +2701 -0
  257. data/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
  258. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +41 -0
  259. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +65 -0
  260. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +80 -0
  261. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1153 -0
  262. data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  263. data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  264. data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +169 -0
  265. data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  266. data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  267. data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  268. data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  269. data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  270. data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  271. data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +61 -0
  272. data/lib/bundler/vendor/pub_grub/lib/pub_grub/strategy.rb +42 -0
  273. data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  274. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  275. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  276. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +423 -0
  277. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +236 -0
  278. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  279. data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  280. data/lib/bundler/vendor/securerandom/COPYING +56 -0
  281. data/lib/bundler/vendor/securerandom/lib/securerandom.rb +102 -0
  282. data/lib/bundler/vendor/thor/LICENSE.md +20 -0
  283. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +105 -0
  284. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +61 -0
  285. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +108 -0
  286. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +143 -0
  287. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +407 -0
  288. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +130 -0
  289. data/lib/bundler/vendor/thor/lib/thor/actions.rb +340 -0
  290. data/lib/bundler/vendor/thor/lib/thor/base.rb +825 -0
  291. data/lib/bundler/vendor/thor/lib/thor/command.rb +151 -0
  292. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +107 -0
  293. data/lib/bundler/vendor/thor/lib/thor/error.rb +106 -0
  294. data/lib/bundler/vendor/thor/lib/thor/group.rb +292 -0
  295. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +178 -0
  296. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +37 -0
  297. data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +88 -0
  298. data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +17 -0
  299. data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
  300. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +86 -0
  301. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +195 -0
  302. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +178 -0
  303. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +294 -0
  304. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
  305. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +72 -0
  306. data/lib/bundler/vendor/thor/lib/thor/runner.rb +335 -0
  307. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +384 -0
  308. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +112 -0
  309. data/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  310. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +81 -0
  311. data/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +118 -0
  312. data/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  313. data/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  314. data/lib/bundler/vendor/thor/lib/thor/shell.rb +81 -0
  315. data/lib/bundler/vendor/thor/lib/thor/util.rb +285 -0
  316. data/lib/bundler/vendor/thor/lib/thor/version.rb +3 -0
  317. data/lib/bundler/vendor/thor/lib/thor.rb +674 -0
  318. data/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
  319. data/lib/bundler/vendor/tsort/lib/tsort.rb +455 -0
  320. data/lib/bundler/vendor/uri/COPYING +56 -0
  321. data/lib/bundler/vendor/uri/lib/uri/common.rb +922 -0
  322. data/lib/bundler/vendor/uri/lib/uri/file.rb +100 -0
  323. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
  324. data/lib/bundler/vendor/uri/lib/uri/generic.rb +1592 -0
  325. data/lib/bundler/vendor/uri/lib/uri/http.rb +137 -0
  326. data/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
  327. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
  328. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +22 -0
  329. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +293 -0
  330. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +547 -0
  331. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +206 -0
  332. data/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
  333. data/lib/bundler/vendor/uri/lib/uri/ws.rb +83 -0
  334. data/lib/bundler/vendor/uri/lib/uri/wss.rb +23 -0
  335. data/lib/bundler/vendor/uri/lib/uri.rb +104 -0
  336. data/lib/bundler/vendored_fileutils.rb +4 -0
  337. data/lib/bundler/vendored_net_http.rb +23 -0
  338. data/lib/bundler/vendored_persistent.rb +11 -0
  339. data/lib/bundler/vendored_pub_grub.rb +4 -0
  340. data/lib/bundler/vendored_securerandom.rb +12 -0
  341. data/lib/bundler/vendored_thor.rb +8 -0
  342. data/lib/bundler/vendored_timeout.rb +12 -0
  343. data/lib/bundler/vendored_tsort.rb +4 -0
  344. data/lib/bundler/vendored_uri.rb +21 -0
  345. data/lib/bundler/version.rb +21 -0
  346. data/lib/bundler/vlad.rb +4 -0
  347. data/lib/bundler/worker.rb +125 -0
  348. data/lib/bundler/yaml_serializer.rb +98 -0
  349. data/lib/bundler.rb +691 -0
  350. metadata +409 -0
@@ -0,0 +1,206 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rubygems/installer"
4
+
5
+ module Bundler
6
+ class RubyGemsGemInstaller < Gem::Installer
7
+ # Cap how many jobserver slots a single gem's `make` may grab so that one
8
+ # gem with many recipes doesn't starve the others sharing the pool. Beyond
9
+ # a handful of jobs the extra parallelism rarely pays off in practice.
10
+ MAX_JOBS_PER_GEM = 3
11
+
12
+ def check_executable_overwrite(filename)
13
+ # Bundler needs to install gems regardless of binstub overwriting
14
+ end
15
+
16
+ def install
17
+ pre_install_checks
18
+
19
+ run_pre_install_hooks
20
+
21
+ spec.loaded_from = spec_file
22
+
23
+ # Completely remove any previous gem files
24
+ strict_rm_rf gem_dir
25
+ strict_rm_rf spec.extension_dir
26
+
27
+ SharedHelpers.filesystem_access(gem_dir, :create) do
28
+ FileUtils.mkdir_p gem_dir
29
+ end
30
+
31
+ SharedHelpers.filesystem_access(gem_dir, :write) do
32
+ extract_files
33
+ end
34
+
35
+ build_extensions if spec.extensions.any?
36
+ write_build_info_file
37
+ run_post_build_hooks
38
+
39
+ SharedHelpers.filesystem_access(bin_dir, :write) do
40
+ generate_bin
41
+ end
42
+
43
+ generate_plugins
44
+
45
+ write_spec
46
+
47
+ SharedHelpers.filesystem_access("#{gem_home}/cache", :write) do
48
+ write_cache_file
49
+ end
50
+
51
+ say spec.post_install_message unless spec.post_install_message.nil?
52
+
53
+ run_post_install_hooks
54
+
55
+ spec
56
+ end
57
+
58
+ if Bundler.rubygems.provides?("< 3.5")
59
+ def pre_install_checks
60
+ super
61
+ rescue Gem::FilePermissionError
62
+ # Ignore permission checks in RubyGems. Instead, go on, and try to write
63
+ # for real. We properly handle permission errors when they happen.
64
+ nil
65
+ end
66
+ end
67
+
68
+ def ensure_writable_dir(dir)
69
+ super
70
+ rescue Gem::FilePermissionError
71
+ # Ignore permission checks in RubyGems. Instead, go on, and try to write
72
+ # for real. We properly handle permission errors when they happen.
73
+ nil
74
+ end
75
+
76
+ def generate_plugins
77
+ return unless Gem::Installer.method_defined?(:generate_plugins, false)
78
+
79
+ ensure_writable_dir @plugins_dir
80
+
81
+ if spec.plugins.empty?
82
+ remove_plugins_for(spec, @plugins_dir)
83
+ else
84
+ regenerate_plugins_for(spec, @plugins_dir)
85
+ end
86
+ end
87
+
88
+ if Bundler.rubygems.provides?("< 3.5.19")
89
+ def generate_bin_script(filename, bindir)
90
+ bin_script_path = File.join bindir, formatted_program_filename(filename)
91
+
92
+ Gem.open_file_with_lock(bin_script_path) do
93
+ require "fileutils"
94
+ FileUtils.rm_f bin_script_path # prior install may have been --no-wrappers
95
+
96
+ File.open(bin_script_path, "wb", 0o755) do |file|
97
+ file.write app_script_text(filename)
98
+ file.chmod(options[:prog_mode] || 0o755)
99
+ end
100
+ end
101
+
102
+ verbose bin_script_path
103
+
104
+ generate_windows_script filename, bindir
105
+ end
106
+ end
107
+
108
+ def build_jobs
109
+ @jobserver_read_io&.read_nonblock(MAX_JOBS_PER_GEM, @jobserver_tokens)
110
+ acquired_jobs = @jobserver_tokens.empty? ? nil : @jobserver_tokens.size
111
+
112
+ acquired_jobs || Bundler.settings[:jobs] || super
113
+ rescue IO::WaitReadable, EOFError
114
+ 1
115
+ end
116
+
117
+ def build_extensions
118
+ @jobserver_tokens = +""
119
+ @jobserver_read_io, @jobserver_write_io = connect_to_jobserver
120
+
121
+ extension_cache_path = options[:bundler_extension_cache_path]
122
+ extension_dir = spec.extension_dir
123
+ unless extension_cache_path && extension_dir
124
+ prepare_extension_build(extension_dir)
125
+ return super
126
+ end
127
+
128
+ build_complete = SharedHelpers.filesystem_access(extension_cache_path.join("gem.build_complete"), :read, &:file?)
129
+ if build_complete && !options[:force]
130
+ SharedHelpers.filesystem_access(File.dirname(extension_dir)) do |p|
131
+ FileUtils.mkpath p
132
+ end
133
+ SharedHelpers.filesystem_access(extension_cache_path) do
134
+ FileUtils.cp_r extension_cache_path, extension_dir
135
+ end
136
+ else
137
+ prepare_extension_build(extension_dir)
138
+ super
139
+ SharedHelpers.filesystem_access(extension_cache_path.parent, &:mkpath)
140
+ SharedHelpers.filesystem_access(extension_cache_path) do
141
+ FileUtils.cp_r extension_dir, extension_cache_path
142
+ end
143
+ end
144
+ ensure
145
+ unless @jobserver_tokens.empty?
146
+ @jobserver_write_io.write(@jobserver_tokens)
147
+ @jobserver_write_io.flush
148
+ end
149
+ end
150
+
151
+ def spec
152
+ if Bundler.rubygems.provides?("< 3.3.12") # RubyGems implementation rescues and re-raises errors before 3.3.12 and we don't want that
153
+ @package.spec
154
+ else
155
+ super
156
+ end
157
+ end
158
+
159
+ def gem_checksum
160
+ Checksum.from_gem_package(@package)
161
+ end
162
+
163
+ private
164
+
165
+ def connect_to_jobserver
166
+ return unless ENV["MAKEFLAGS"]
167
+ # We append our own --jobserver-auth, so read the last one. Otherwise a
168
+ # parent jobserver's descriptors (e.g. `bundle install` run under
169
+ # `make -j`) would be picked up instead of the pool ParallelInstaller created.
170
+ read_fd, write_fd = ENV["MAKEFLAGS"].scan(/--jobserver-auth=(\d+),(\d+)/).last
171
+
172
+ return unless read_fd && write_fd
173
+
174
+ # Pass explicit modes. On POSIX, IO.new detects the descriptor's access
175
+ # mode, but on Windows it can't, so the write end would default to read
176
+ # mode and raise "IOError: not opened for writing" when releasing slots.
177
+ [IO.new(read_fd.to_i, "r", autoclose: false), IO.new(write_fd.to_i, "w", autoclose: false)]
178
+ end
179
+
180
+ def prepare_extension_build(extension_dir)
181
+ SharedHelpers.filesystem_access(extension_dir, :create) do
182
+ FileUtils.mkdir_p extension_dir
183
+ end
184
+ end
185
+
186
+ def strict_rm_rf(dir)
187
+ return unless File.exist?(dir)
188
+ return if Dir.empty?(dir)
189
+
190
+ parent = File.dirname(dir)
191
+ parent_st = File.stat(parent)
192
+
193
+ if parent_st.world_writable? && !parent_st.sticky?
194
+ raise InsecureInstallPathError.new(spec.full_name, dir)
195
+ end
196
+
197
+ begin
198
+ FileUtils.remove_entry_secure(dir)
199
+ rescue StandardError => e
200
+ raise unless File.exist?(dir)
201
+
202
+ raise DirectoryRemovalError.new(e, "Could not delete previous installation of `#{dir}`")
203
+ end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,456 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rubygems" unless defined?(Gem)
4
+
5
+ module Bundler
6
+ class RubygemsIntegration
7
+ require "monitor"
8
+
9
+ EXT_LOCK = Monitor.new
10
+
11
+ def initialize
12
+ @replaced_methods = {}
13
+ end
14
+
15
+ def version
16
+ @version ||= Gem.rubygems_version
17
+ end
18
+
19
+ def provides?(req_str)
20
+ Gem::Requirement.new(req_str).satisfied_by?(version)
21
+ end
22
+
23
+ def build_args
24
+ require "rubygems/command"
25
+ Gem::Command.build_args
26
+ end
27
+
28
+ def build_args=(args)
29
+ require "rubygems/command"
30
+ Gem::Command.build_args = args
31
+ end
32
+
33
+ def set_target_rbconfig(path)
34
+ Gem.set_target_rbconfig(path)
35
+ end
36
+
37
+ def loaded_specs(name)
38
+ Gem.loaded_specs[name]
39
+ end
40
+
41
+ def mark_loaded(spec)
42
+ if spec.respond_to?(:activated=)
43
+ current = Gem.loaded_specs[spec.name]
44
+ current.activated = false if current
45
+ spec.activated = true
46
+ end
47
+ Gem.loaded_specs[spec.name] = spec
48
+ end
49
+
50
+ def validate(spec)
51
+ Bundler.ui.silence { spec.validate_for_resolution }
52
+ rescue Gem::InvalidSpecificationException => e
53
+ error_message = "The gemspec at #{spec.loaded_from} is not valid. Please fix this gemspec.\n" \
54
+ "The validation error was '#{e.message}'\n"
55
+ raise Gem::InvalidSpecificationException.new(error_message)
56
+ rescue Errno::ENOENT
57
+ nil
58
+ end
59
+
60
+ def stub_set_spec(stub, spec)
61
+ stub.instance_variable_set(:@spec, spec)
62
+ end
63
+
64
+ def path(obj)
65
+ obj.to_s
66
+ end
67
+
68
+ def ruby_engine
69
+ Gem.ruby_engine
70
+ end
71
+
72
+ def read_binary(path)
73
+ Gem.read_binary(path)
74
+ end
75
+
76
+ def inflate(obj)
77
+ Gem::Util.inflate(obj)
78
+ end
79
+
80
+ def gem_dir
81
+ Gem.dir
82
+ end
83
+
84
+ def gem_bindir
85
+ Gem.bindir
86
+ end
87
+
88
+ def user_home
89
+ Gem.user_home
90
+ end
91
+
92
+ def gem_path
93
+ Gem.path
94
+ end
95
+
96
+ def reset
97
+ Gem::Specification.reset
98
+ end
99
+
100
+ def post_reset_hooks
101
+ Gem.post_reset_hooks
102
+ end
103
+
104
+ def suffix_pattern
105
+ Gem.suffix_pattern
106
+ end
107
+
108
+ def gem_cache
109
+ gem_path.map {|p| File.expand_path("cache", p) }
110
+ end
111
+
112
+ def spec_cache_dirs
113
+ @spec_cache_dirs ||= begin
114
+ dirs = gem_path.map {|dir| File.join(dir, "specifications") }
115
+ dirs << Gem.spec_cache_dir
116
+ dirs.uniq.select {|dir| File.directory? dir }
117
+ end
118
+ end
119
+
120
+ def marshal_spec_dir
121
+ Gem::MARSHAL_SPEC_DIR
122
+ end
123
+
124
+ def clear_paths
125
+ Gem.clear_paths
126
+ end
127
+
128
+ def bin_path(gem, bin, ver)
129
+ Gem.bin_path(gem, bin, ver)
130
+ end
131
+
132
+ def loaded_gem_paths
133
+ loaded_gem_paths = Gem.loaded_specs.map {|_, s| s.full_require_paths }
134
+ loaded_gem_paths.flatten
135
+ end
136
+
137
+ def ui=(obj)
138
+ Gem::DefaultUserInteraction.ui = obj
139
+ end
140
+
141
+ def ext_lock
142
+ EXT_LOCK
143
+ end
144
+
145
+ def spec_from_gem(path)
146
+ require "rubygems/package"
147
+ Gem::Package.new(path).spec
148
+ end
149
+
150
+ def build_gem(gem_dir, spec)
151
+ build(spec)
152
+ end
153
+
154
+ def security_policy_keys
155
+ %w[High Medium Low AlmostNo No].map {|level| "#{level}Security" }
156
+ end
157
+
158
+ def security_policies
159
+ @security_policies ||= begin
160
+ require "rubygems/security"
161
+ Gem::Security::Policies
162
+ rescue LoadError, NameError
163
+ {}
164
+ end
165
+ end
166
+
167
+ def reverse_rubygems_kernel_mixin
168
+ # Disable rubygems' gem activation system
169
+ if Gem.respond_to?(:discover_gems_on_require=)
170
+ Gem.discover_gems_on_require = false
171
+ else
172
+ [::Kernel.singleton_class, ::Kernel].each do |k|
173
+ if k.private_method_defined?(:gem_original_require)
174
+ redefine_method(k, :require, k.instance_method(:gem_original_require))
175
+ end
176
+ end
177
+ end
178
+ end
179
+
180
+ def replace_gem(specs_by_name)
181
+ executables = nil
182
+
183
+ [::Kernel.singleton_class, ::Kernel].each do |kernel_class|
184
+ redefine_method(kernel_class, :gem) do |dep, *reqs|
185
+ if executables&.include?(File.basename(caller_locations(1, 1).first.path))
186
+ break
187
+ end
188
+
189
+ reqs.pop if reqs.last.is_a?(Hash)
190
+
191
+ unless dep.respond_to?(:name) && dep.respond_to?(:requirement)
192
+ dep = Gem::Dependency.new(dep, reqs)
193
+ end
194
+
195
+ if spec = specs_by_name[dep.name]
196
+ return true if dep.matches_spec?(spec)
197
+ end
198
+
199
+ message = if spec.nil?
200
+ target_file = begin
201
+ Bundler.default_gemfile.basename
202
+ rescue GemfileNotFound
203
+ "inline Gemfile"
204
+ end
205
+ "#{dep.name} is not part of the bundle." \
206
+ " Add it to your #{target_file}."
207
+ else
208
+ "can't activate #{dep}, already activated #{spec.full_name}. " \
209
+ "Make sure all dependencies are added to Gemfile."
210
+ end
211
+
212
+ e = Gem::LoadError.new(message)
213
+ e.name = dep.name
214
+ e.requirement = dep.requirement
215
+ raise e
216
+ end
217
+ end
218
+ end
219
+
220
+ # Used to give better error messages when activating specs outside of the current bundle
221
+ def replace_bin_path(specs_by_name)
222
+ redefine_method(gem_class, :find_spec_for_exe) do |gem_name, *args|
223
+ exec_name = args.first
224
+ raise ArgumentError, "you must supply exec_name" unless exec_name
225
+
226
+ spec_with_name = specs_by_name[gem_name]
227
+ matching_specs_by_exec_name = specs_by_name.values.select {|s| s.executables.include?(exec_name) }
228
+ spec = matching_specs_by_exec_name.delete(spec_with_name)
229
+
230
+ unless spec || !matching_specs_by_exec_name.empty?
231
+ message = "can't find executable #{exec_name} for gem #{gem_name}"
232
+ if spec_with_name.nil?
233
+ message += ". #{gem_name} is not currently included in the bundle, " \
234
+ "perhaps you meant to add it to your #{Bundler.default_gemfile.basename}?"
235
+ end
236
+ raise Gem::Exception, message
237
+ end
238
+
239
+ unless spec
240
+ spec = matching_specs_by_exec_name.shift
241
+ warn \
242
+ "Bundler is using a binstub that was created for a different gem (#{spec.name}).\n" \
243
+ "You should run `bundle binstub #{gem_name}` " \
244
+ "to work around a system/bundle conflict."
245
+ end
246
+
247
+ unless matching_specs_by_exec_name.empty?
248
+ conflicting_names = matching_specs_by_exec_name.map(&:name).join(", ")
249
+ warn \
250
+ "The `#{exec_name}` executable in the `#{spec.name}` gem is being loaded, but it's also present in other gems (#{conflicting_names}).\n" \
251
+ "If you meant to run the executable for another gem, make sure you use a project specific binstub (`bundle binstub <gem_name>`).\n" \
252
+ "If you plan to use multiple conflicting executables, generate binstubs for them and disambiguate their names."
253
+ end
254
+
255
+ spec
256
+ end
257
+ end
258
+
259
+ # Replace or hook into RubyGems to provide a bundlerized view
260
+ # of the world.
261
+ def replace_entrypoints(specs)
262
+ specs_by_name = add_default_gems_to(specs)
263
+
264
+ reverse_rubygems_kernel_mixin
265
+ begin
266
+ # bundled_gems only provide with Ruby 3.3 or later
267
+ require "bundled_gems"
268
+ rescue LoadError
269
+ else
270
+ Gem::BUNDLED_GEMS.replace_require(specs) if Gem::BUNDLED_GEMS.respond_to?(:replace_require)
271
+ end
272
+ replace_gem(specs_by_name)
273
+ stub_rubygems(specs_by_name.values)
274
+ replace_bin_path(specs_by_name)
275
+
276
+ Gem.clear_paths
277
+ end
278
+
279
+ # Add default gems not already present in specs, and return them as a hash.
280
+ def add_default_gems_to(specs)
281
+ specs_by_name = specs.reduce({}) do |h, s|
282
+ h[s.name] = s
283
+ h
284
+ end
285
+
286
+ Bundler.rubygems.default_stubs.each do |stub|
287
+ default_spec = stub.to_spec
288
+ default_spec_name = default_spec.name
289
+ next if specs_by_name.key?(default_spec_name)
290
+
291
+ specs_by_name[default_spec_name] = default_spec
292
+ end
293
+
294
+ specs_by_name
295
+ end
296
+
297
+ def undo_replacements
298
+ @replaced_methods.each do |(sym, klass), method|
299
+ redefine_method(klass, sym, method)
300
+ end
301
+ post_reset_hooks.reject! {|proc| proc.binding.source_location[0] == __FILE__ }
302
+ @replaced_methods.clear
303
+ end
304
+
305
+ def redefine_method(klass, method, unbound_method = nil, &block)
306
+ visibility = method_visibility(klass, method)
307
+ begin
308
+ if (instance_method = klass.instance_method(method)) && method != :initialize
309
+ # doing this to ensure we also get private methods
310
+ klass.send(:remove_method, method)
311
+ end
312
+ rescue NameError
313
+ # method isn't defined
314
+ nil
315
+ end
316
+ @replaced_methods[[method, klass]] = instance_method
317
+ if unbound_method
318
+ klass.send(:define_method, method, unbound_method)
319
+ klass.send(visibility, method)
320
+ elsif block
321
+ klass.send(:define_method, method, &block)
322
+ klass.send(visibility, method)
323
+ end
324
+ end
325
+
326
+ def method_visibility(klass, method)
327
+ if klass.private_method_defined?(method)
328
+ :private
329
+ elsif klass.protected_method_defined?(method)
330
+ :protected
331
+ else
332
+ :public
333
+ end
334
+ end
335
+
336
+ def stub_rubygems(specs)
337
+ Gem::Specification.all = specs
338
+
339
+ Gem.post_reset do
340
+ Gem::Specification.all = specs
341
+ end
342
+
343
+ redefine_method(gem_class, :finish_resolve) do |*|
344
+ []
345
+ end
346
+
347
+ redefine_method(gem_class, :load_plugins) do |*|
348
+ load_plugin_files specs.flat_map(&:plugins)
349
+ end
350
+ end
351
+
352
+ def plain_specs
353
+ Gem::Specification._all
354
+ end
355
+
356
+ def plain_specs=(specs)
357
+ Gem::Specification.all = specs
358
+ end
359
+
360
+ def fetch_specs(remote, name, fetcher)
361
+ require "rubygems/remote_fetcher"
362
+ path = remote.uri.to_s + "#{name}.#{Gem.marshal_version}.gz"
363
+ string = fetcher.fetch_path(path)
364
+ specs = Bundler.safe_load_marshal(string)
365
+ raise MarshalError, "Specs #{name} from #{remote} is expected to be an Array but was unexpected class #{specs.class}" unless specs.is_a?(Array)
366
+ specs
367
+ rescue Gem::RemoteFetcher::FetchError
368
+ # it's okay for prerelease to fail
369
+ raise unless name == "prerelease_specs"
370
+ end
371
+
372
+ def fetch_all_remote_specs(remote, gem_remote_fetcher)
373
+ specs = fetch_specs(remote, "specs", gem_remote_fetcher)
374
+ pres = fetch_specs(remote, "prerelease_specs", gem_remote_fetcher) || []
375
+
376
+ specs.concat(pres)
377
+ end
378
+
379
+ def download_gem(spec, uri, cache_dir, fetcher)
380
+ require "rubygems/remote_fetcher"
381
+ uri = Bundler.settings.mirror_for(uri)
382
+ redacted_uri = Gem::Uri.redact(uri)
383
+
384
+ Bundler::Retry.new("download gem from #{redacted_uri}").attempts do
385
+ gem_file_name = spec.file_name
386
+ local_gem_path = File.join cache_dir, gem_file_name
387
+ return if File.exist? local_gem_path
388
+
389
+ begin
390
+ remote_gem_path = uri + "gems/#{gem_file_name}"
391
+
392
+ SharedHelpers.filesystem_access(local_gem_path) do
393
+ fetcher.cache_update_path remote_gem_path, local_gem_path
394
+ end
395
+ rescue Gem::RemoteFetcher::FetchError
396
+ raise if spec.original_platform == spec.platform
397
+
398
+ original_gem_file_name = "#{spec.original_name}.gem"
399
+ raise if gem_file_name == original_gem_file_name
400
+
401
+ gem_file_name = original_gem_file_name
402
+ retry
403
+ end
404
+ end
405
+ rescue Gem::RemoteFetcher::FetchError => e
406
+ raise Bundler::HTTPError, "Could not download gem from #{redacted_uri} due to underlying error <#{e.message}>"
407
+ end
408
+
409
+ def build(spec, skip_validation = false)
410
+ require "rubygems/package"
411
+ Gem::Package.build(spec, skip_validation)
412
+ end
413
+
414
+ def path_separator
415
+ Gem.path_separator
416
+ end
417
+
418
+ def all_specs
419
+ SharedHelpers.feature_removed! "Bundler.rubygems.all_specs has been removed in favor of Bundler.rubygems.installed_specs"
420
+ end
421
+
422
+ def installed_specs
423
+ Gem::Specification.stubs.reject(&:default_gem?).map do |stub|
424
+ StubSpecification.from_stub(stub)
425
+ end
426
+ end
427
+
428
+ def default_specs
429
+ Gem::Specification.default_stubs.map do |stub|
430
+ StubSpecification.from_stub(stub)
431
+ end
432
+ end
433
+
434
+ def find_bundler(version)
435
+ find_name("bundler").find {|s| s.version.to_s == version.to_s }
436
+ end
437
+
438
+ def find_name(name)
439
+ Gem::Specification.stubs_for(name).map(&:to_spec)
440
+ end
441
+
442
+ def default_stubs
443
+ Gem::Specification.default_stubs("*.gemspec")
444
+ end
445
+
446
+ private
447
+
448
+ def gem_class
449
+ class << Gem; self; end
450
+ end
451
+ end
452
+
453
+ def self.rubygems
454
+ @rubygems ||= RubygemsIntegration.new
455
+ end
456
+ end