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,493 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CLI
5
+ Bundler.require_thor_actions
6
+ include Thor::Actions
7
+ end
8
+
9
+ class CLI::Gem
10
+ TEST_FRAMEWORK_VERSIONS = {
11
+ "rspec" => "3.0",
12
+ "minitest" => "5.16",
13
+ "test-unit" => "3.0",
14
+ }.freeze
15
+
16
+ DEFAULT_GITHUB_USERNAME = "[USERNAME]"
17
+
18
+ attr_reader :options, :gem_name, :thor, :name, :target, :extension
19
+
20
+ def initialize(options, gem_name, thor)
21
+ @options = options
22
+ @gem_name = resolve_name(gem_name)
23
+
24
+ @thor = thor
25
+ thor.behavior = :invoke
26
+ thor.destination_root = nil
27
+
28
+ @name = @gem_name
29
+ @target = Pathname.new(SharedHelpers.pwd).join(gem_name)
30
+
31
+ @extension = options[:ext]
32
+
33
+ validate_ext_name if @extension
34
+ end
35
+
36
+ def run
37
+ Bundler.ui.confirm "Creating gem '#{name}'..."
38
+
39
+ underscored_name = name.tr("-", "_")
40
+ namespaced_path = name.tr("-", "/")
41
+ constant_name = name.gsub(/-[_-]*(?![_-]|$)/) { "::" }.gsub(/([_-]+|(::)|^)(.|$)/) { $2.to_s + $3.upcase }
42
+ constant_array = constant_name.split("::")
43
+ minitest_constant_name = constant_array.clone.tap {|a| a[-1] = "Test#{a[-1]}" }.join("::") # Foo::Bar => Foo::TestBar
44
+
45
+ use_git = Bundler.git_present? && options[:git]
46
+
47
+ git_author_name = use_git ? `git config user.name`.chomp : ""
48
+ git_username = use_git ? `git config github.user`.chomp : ""
49
+ git_user_email = use_git ? `git config user.email`.chomp : ""
50
+ github_username = github_username(git_username)
51
+
52
+ if github_username.empty?
53
+ homepage_uri = "TODO: Put your gem's website or public repo URL here."
54
+ source_code_uri = "TODO: Put your gem's public repo URL here."
55
+ changelog_uri = "TODO: Put your gem's CHANGELOG.md URL here."
56
+ else
57
+ homepage_uri = "https://github.com/#{github_username}/#{name}"
58
+ source_code_uri = "https://github.com/#{github_username}/#{name}"
59
+ changelog_uri = "https://github.com/#{github_username}/#{name}/blob/main/CHANGELOG.md"
60
+ end
61
+
62
+ config = {
63
+ name: name,
64
+ underscored_name: underscored_name,
65
+ namespaced_path: namespaced_path,
66
+ makefile_path: "#{underscored_name}/#{underscored_name}",
67
+ constant_name: constant_name,
68
+ constant_array: constant_array,
69
+ author: git_author_name.empty? ? "TODO: Write your name" : git_author_name,
70
+ email: git_user_email.empty? ? "TODO: Write your email address" : git_user_email,
71
+ test: options[:test],
72
+ ext: extension,
73
+ exe: options[:exe],
74
+ bundle: options[:bundle],
75
+ bundler_version: bundler_dependency_version,
76
+ git: use_git,
77
+ github_username: github_username.empty? ? DEFAULT_GITHUB_USERNAME : github_username,
78
+ required_ruby_version: required_ruby_version,
79
+ rust_builder_required_rubygems_version: rust_builder_required_rubygems_version,
80
+ minitest_constant_name: minitest_constant_name,
81
+ ignore_paths: %w[bin/],
82
+ homepage_uri: homepage_uri,
83
+ source_code_uri: source_code_uri,
84
+ changelog_uri: changelog_uri,
85
+ }
86
+ ensure_safe_gem_name(name, constant_array)
87
+
88
+ templates = {
89
+ "Gemfile.tt" => Bundler.preferred_gemfile_name,
90
+ "lib/newgem.rb.tt" => "lib/#{namespaced_path}.rb",
91
+ "lib/newgem/version.rb.tt" => "lib/#{namespaced_path}/version.rb",
92
+ "sig/newgem.rbs.tt" => "sig/#{namespaced_path}.rbs",
93
+ "newgem.gemspec.tt" => "#{name}.gemspec",
94
+ "Rakefile.tt" => "Rakefile",
95
+ "README.md.tt" => "README.md",
96
+ "bin/console.tt" => "bin/console",
97
+ "bin/setup.tt" => "bin/setup",
98
+ }
99
+
100
+ executables = %w[
101
+ bin/console
102
+ bin/setup
103
+ ]
104
+
105
+ case Bundler.preferred_gemfile_name
106
+ when "Gemfile"
107
+ config[:ignore_paths] << "Gemfile"
108
+ when "gems.rb"
109
+ config[:ignore_paths] << "gems.rb"
110
+ config[:ignore_paths] << "gems.locked"
111
+ end
112
+
113
+ if use_git
114
+ templates.merge!("gitignore.tt" => ".gitignore")
115
+ config[:ignore_paths] << ".gitignore"
116
+ end
117
+
118
+ if test_framework = ask_and_set_test_framework
119
+ config[:test] = test_framework
120
+ config[:test_framework_version] = TEST_FRAMEWORK_VERSIONS[test_framework]
121
+
122
+ case test_framework
123
+ when "rspec"
124
+ templates.merge!(
125
+ "rspec.tt" => ".rspec",
126
+ "spec/spec_helper.rb.tt" => "spec/spec_helper.rb",
127
+ "spec/newgem_spec.rb.tt" => "spec/#{namespaced_path}_spec.rb"
128
+ )
129
+ config[:test_task] = :spec
130
+ config[:ignore_paths] << ".rspec"
131
+ config[:ignore_paths] << "spec/"
132
+ when "minitest"
133
+ # Generate path for minitest target file (FileList["test/**/test_*.rb"])
134
+ # foo => test/test_foo.rb
135
+ # foo-bar => test/foo/test_bar.rb
136
+ # foo_bar => test/test_foo_bar.rb
137
+ paths = namespaced_path.rpartition("/")
138
+ paths[2] = "test_#{paths[2]}"
139
+ minitest_namespaced_path = paths.join("")
140
+
141
+ templates.merge!(
142
+ "test/minitest/test_helper.rb.tt" => "test/test_helper.rb",
143
+ "test/minitest/test_newgem.rb.tt" => "test/#{minitest_namespaced_path}.rb"
144
+ )
145
+ config[:test_task] = :test
146
+ config[:ignore_paths] << "test/"
147
+ when "test-unit"
148
+ templates.merge!(
149
+ "test/test-unit/test_helper.rb.tt" => "test/test_helper.rb",
150
+ "test/test-unit/newgem_test.rb.tt" => "test/#{namespaced_path}_test.rb"
151
+ )
152
+ config[:test_task] = :test
153
+ config[:ignore_paths] << "test/"
154
+ end
155
+ end
156
+
157
+ config[:ci] = ask_and_set_ci
158
+ case config[:ci]
159
+ when "github"
160
+ templates.merge!("github/workflows/main.yml.tt" => ".github/workflows/main.yml")
161
+ if extension == "rust"
162
+ templates.merge!("github/workflows/build-gems.yml.tt" => ".github/workflows/build-gems.yml")
163
+ end
164
+ config[:ignore_paths] << ".github/"
165
+ when "gitlab"
166
+ templates.merge!("gitlab-ci.yml.tt" => ".gitlab-ci.yml")
167
+ config[:ignore_paths] << ".gitlab-ci.yml"
168
+ when "circle"
169
+ templates.merge!("circleci/config.yml.tt" => ".circleci/config.yml")
170
+ config[:ignore_paths] << ".circleci/"
171
+ end
172
+
173
+ if ask_and_set(:mit, "Do you want to license your code permissively under the MIT license?",
174
+ "Using a MIT license means that any other developer or company will be legally allowed " \
175
+ "to use your code for free as long as they admit you created it. You can read more about " \
176
+ "the MIT license at https://choosealicense.com/licenses/mit.")
177
+ config[:mit] = true
178
+ Bundler.ui.info "MIT License enabled in config"
179
+ templates.merge!("LICENSE.txt.tt" => "LICENSE.txt")
180
+ end
181
+
182
+ if ask_and_set(:coc, "Do you want to include a code of conduct in gems you generate?",
183
+ "Codes of conduct can increase contributions to your project by contributors who " \
184
+ "prefer safe, respectful, productive, and collaborative spaces. \n" \
185
+ "See https://github.com/ruby/rubygems/blob/master/CODE_OF_CONDUCT.md")
186
+ config[:coc] = true
187
+ Bundler.ui.info "Code of conduct enabled in config"
188
+ templates.merge!("CODE_OF_CONDUCT.md.tt" => "CODE_OF_CONDUCT.md")
189
+ end
190
+
191
+ if ask_and_set(:changelog, "Do you want to include a changelog?",
192
+ "A changelog is a file which contains a curated, chronologically ordered list of notable " \
193
+ "changes for each version of a project. To make it easier for users and contributors to" \
194
+ " see precisely what notable changes have been made between each release (or version) of" \
195
+ " the project. Whether consumers or developers, the end users of software are" \
196
+ " human beings who care about what's in the software. When the software changes, people " \
197
+ "want to know why and how. see https://keepachangelog.com")
198
+ config[:changelog] = true
199
+ Bundler.ui.info "Changelog enabled in config"
200
+ templates.merge!("CHANGELOG.md.tt" => "CHANGELOG.md")
201
+ end
202
+
203
+ config[:linter] = ask_and_set_linter
204
+ case config[:linter]
205
+ when "rubocop"
206
+ config[:linter_version] = rubocop_version
207
+ Bundler.ui.info "RuboCop enabled in config"
208
+ templates.merge!("rubocop.yml.tt" => ".rubocop.yml")
209
+ config[:ignore_paths] << ".rubocop.yml"
210
+ when "standard"
211
+ config[:linter_version] = standard_version
212
+ Bundler.ui.info "Standard enabled in config"
213
+ templates.merge!("standard.yml.tt" => ".standard.yml")
214
+ config[:ignore_paths] << ".standard.yml"
215
+ end
216
+
217
+ if config[:exe]
218
+ templates.merge!("exe/newgem.tt" => "exe/#{name}")
219
+ executables.push("exe/#{name}")
220
+ end
221
+
222
+ if extension == "c"
223
+ templates.merge!(
224
+ "ext/newgem/extconf-c.rb.tt" => "ext/#{name}/extconf.rb",
225
+ "ext/newgem/newgem.h.tt" => "ext/#{name}/#{underscored_name}.h",
226
+ "ext/newgem/newgem.c.tt" => "ext/#{name}/#{underscored_name}.c"
227
+ )
228
+ end
229
+
230
+ if extension == "rust"
231
+ templates.merge!(
232
+ "Cargo.toml.tt" => "Cargo.toml",
233
+ "ext/newgem/Cargo.toml.tt" => "ext/#{name}/Cargo.toml",
234
+ "ext/newgem/build.rs.tt" => "ext/#{name}/build.rs",
235
+ "ext/newgem/extconf-rust.rb.tt" => "ext/#{name}/extconf.rb",
236
+ "ext/newgem/src/lib.rs.tt" => "ext/#{name}/src/lib.rs",
237
+ )
238
+ end
239
+
240
+ if extension == "go"
241
+ templates.merge!(
242
+ "ext/newgem/go.mod.tt" => "ext/#{name}/go.mod",
243
+ "ext/newgem/extconf-go.rb.tt" => "ext/#{name}/extconf.rb",
244
+ "ext/newgem/newgem.h.tt" => "ext/#{name}/#{underscored_name}.h",
245
+ "ext/newgem/newgem.go.tt" => "ext/#{name}/#{underscored_name}.go",
246
+ "ext/newgem/newgem-go.c.tt" => "ext/#{name}/#{underscored_name}.c",
247
+ )
248
+
249
+ config[:go_module_username] = config[:github_username] == DEFAULT_GITHUB_USERNAME ? "username" : config[:github_username]
250
+ end
251
+
252
+ if target.exist? && !target.directory?
253
+ Bundler.ui.error "Couldn't create a new gem named `#{gem_name}` because there's an existing file named `#{gem_name}`."
254
+ exit Bundler::BundlerError.all_errors[Bundler::GenericSystemCallError]
255
+ end
256
+
257
+ if use_git
258
+ Bundler.ui.info "\nInitializing git repo in #{target}"
259
+ require "shellwords"
260
+ `git init #{target.to_s.shellescape}`
261
+
262
+ config[:git_default_branch] = File.read("#{target}/.git/HEAD").split("/").last.chomp
263
+ end
264
+
265
+ templates.each do |src, dst|
266
+ destination = target.join(dst)
267
+ thor.template("newgem/#{src}", destination, config)
268
+ end
269
+
270
+ executables.each do |file|
271
+ path = target.join(file)
272
+ executable = (path.stat.mode | 0o111)
273
+ path.chmod(executable)
274
+ end
275
+
276
+ if use_git
277
+ IO.popen(%w[git add .], { chdir: target }, &:read)
278
+ end
279
+
280
+ if config[:bundle]
281
+ Bundler.ui.info "Running bundle install in the new gem directory."
282
+ Dir.chdir(target) do
283
+ system("bundle install")
284
+ end
285
+ end
286
+
287
+ # Open gemspec in editor
288
+ open_editor(options["edit"], target.join("#{name}.gemspec")) if options[:edit]
289
+
290
+ Bundler.ui.info "\nGem '#{name}' was successfully created. " \
291
+ "For more information on making a RubyGem visit https://guides.rubygems.org/make-your-own-gem/"
292
+ end
293
+
294
+ private
295
+
296
+ def resolve_name(name)
297
+ Pathname.new(SharedHelpers.pwd).join(name).basename.to_s
298
+ end
299
+
300
+ def ask_and_set(key, prompt, explanation)
301
+ choice = options[key]
302
+ choice = Bundler.settings["gem.#{key}"] if choice.nil?
303
+
304
+ if choice.nil?
305
+ Bundler.ui.info "\n#{explanation}"
306
+ choice = Bundler.ui.yes? "#{prompt} y/(n):"
307
+ Bundler.settings.set_global("gem.#{key}", choice)
308
+ end
309
+
310
+ choice
311
+ end
312
+
313
+ def validate_ext_name
314
+ return unless gem_name.index("-")
315
+
316
+ Bundler.ui.error "You have specified a gem name which does not conform to the \n" \
317
+ "naming guidelines for C extensions. For more information, \n" \
318
+ "see the 'Extension Naming' section at the following URL:\n" \
319
+ "https://guides.rubygems.org/gems-with-extensions/\n"
320
+ exit 1
321
+ end
322
+
323
+ def ask_and_set_test_framework
324
+ return if skip?(:test)
325
+ test_framework = options[:test] || Bundler.settings["gem.test"]
326
+
327
+ if test_framework.to_s.empty?
328
+ Bundler.ui.info "\nDo you want to generate tests with your gem?"
329
+ Bundler.ui.info hint_text("test")
330
+
331
+ result = Bundler.ui.ask "Enter a test framework. rspec/minitest/test-unit/(none):"
332
+ if /rspec|minitest|test-unit/.match?(result)
333
+ test_framework = result
334
+ else
335
+ test_framework = false
336
+ end
337
+ end
338
+
339
+ if Bundler.settings["gem.test"].nil?
340
+ Bundler.settings.set_global("gem.test", test_framework)
341
+ end
342
+
343
+ if options[:test] == Bundler.settings["gem.test"]
344
+ Bundler.ui.info "#{options[:test]} is already configured, ignoring --test flag."
345
+ end
346
+
347
+ test_framework
348
+ end
349
+
350
+ def skip?(option)
351
+ options.key?(option) && options[option].nil?
352
+ end
353
+
354
+ def hint_text(setting)
355
+ if Bundler.settings["gem.#{setting}"] == false
356
+ "Your choice will only be applied to this gem."
357
+ else
358
+ "Future `bundle gem` calls will use your choice. " \
359
+ "This setting can be changed anytime with `bundle config gem.#{setting}`."
360
+ end
361
+ end
362
+
363
+ def ask_and_set_ci
364
+ return if skip?(:ci)
365
+ ci_template = options[:ci] || Bundler.settings["gem.ci"]
366
+
367
+ if ci_template.to_s.empty?
368
+ Bundler.ui.info "\nDo you want to set up continuous integration for your gem? " \
369
+ "Supported services:\n" \
370
+ "* CircleCI: https://circleci.com/\n" \
371
+ "* GitHub Actions: https://github.com/features/actions\n" \
372
+ "* GitLab CI: https://docs.gitlab.com/ee/ci/\n"
373
+ Bundler.ui.info hint_text("ci")
374
+
375
+ result = Bundler.ui.ask "Enter a CI service. github/gitlab/circle/(none):"
376
+ if /github|gitlab|circle/.match?(result)
377
+ ci_template = result
378
+ else
379
+ ci_template = false
380
+ end
381
+ end
382
+
383
+ if Bundler.settings["gem.ci"].nil?
384
+ Bundler.settings.set_global("gem.ci", ci_template)
385
+ end
386
+
387
+ if options[:ci] == Bundler.settings["gem.ci"]
388
+ Bundler.ui.info "#{options[:ci]} is already configured, ignoring --ci flag."
389
+ end
390
+
391
+ ci_template
392
+ end
393
+
394
+ def ask_and_set_linter
395
+ return if skip?(:linter)
396
+ linter_template = options[:linter] || Bundler.settings["gem.linter"]
397
+
398
+ if linter_template.to_s.empty?
399
+ Bundler.ui.info "\nDo you want to add a code linter and formatter to your gem? " \
400
+ "Supported Linters:\n" \
401
+ "* RuboCop: https://rubocop.org\n" \
402
+ "* Standard: https://github.com/standardrb/standard\n"
403
+ Bundler.ui.info hint_text("linter")
404
+
405
+ result = Bundler.ui.ask "Enter a linter. rubocop/standard/(none):"
406
+ if /rubocop|standard/.match?(result)
407
+ linter_template = result
408
+ else
409
+ linter_template = false
410
+ end
411
+ end
412
+
413
+ if Bundler.settings["gem.linter"].nil?
414
+ Bundler.settings.set_global("gem.linter", linter_template)
415
+ end
416
+
417
+ # Once gem.linter safely set, unset the deprecated gem.rubocop
418
+ unless Bundler.settings["gem.rubocop"].nil?
419
+ Bundler.settings.set_global("gem.rubocop", nil)
420
+ end
421
+
422
+ if options[:linter] == Bundler.settings["gem.linter"]
423
+ Bundler.ui.info "#{options[:linter]} is already configured, ignoring --linter flag."
424
+ end
425
+
426
+ linter_template
427
+ end
428
+
429
+ def bundler_dependency_version
430
+ v = Gem::Version.new(Bundler::VERSION)
431
+ req = v.segments[0..1]
432
+ req << "a" if v.prerelease?
433
+ req.join(".")
434
+ end
435
+
436
+ def ensure_safe_gem_name(name, constant_array)
437
+ if /^\d/.match?(name)
438
+ Bundler.ui.error "Invalid gem name #{name} Please give a name which does not start with numbers."
439
+ exit 1
440
+ end
441
+
442
+ if /[A-Z]/.match?(name)
443
+ Bundler.ui.warn "Gem names with capital letters are not recommended. Please use only lowercase letters, numbers, and hyphens."
444
+ end
445
+
446
+ constant_name = constant_array.join("::")
447
+
448
+ existing_constant = constant_array.inject(Object) do |c, s|
449
+ defined = begin
450
+ c.const_defined?(s)
451
+ rescue NameError
452
+ Bundler.ui.error "Invalid gem name #{name} -- `#{constant_name}` is an invalid constant name"
453
+ exit 1
454
+ end
455
+ (defined && c.const_get(s)) || break
456
+ end
457
+
458
+ return unless existing_constant
459
+ Bundler.ui.error "Invalid gem name #{name} constant #{constant_name} is already in use. Please choose another gem name."
460
+ exit 1
461
+ end
462
+
463
+ def open_editor(editor, file)
464
+ thor.run(%(#{editor} "#{file}"))
465
+ end
466
+
467
+ def rust_builder_required_rubygems_version
468
+ "3.3.11"
469
+ end
470
+
471
+ def required_ruby_version
472
+ "3.2.0"
473
+ end
474
+
475
+ def rubocop_version
476
+ "1.21"
477
+ end
478
+
479
+ def standard_version
480
+ "1.3"
481
+ end
482
+
483
+ def github_username(git_username)
484
+ if options[:github_username].nil?
485
+ git_username
486
+ elsif options[:github_username] == false
487
+ ""
488
+ else
489
+ options[:github_username]
490
+ end
491
+ end
492
+ end
493
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CLI::Info
5
+ attr_reader :gem_name, :options
6
+ def initialize(options, gem_name)
7
+ @options = options
8
+ @gem_name = gem_name
9
+ end
10
+
11
+ def run
12
+ Bundler.ui.silence do
13
+ Bundler.definition.validate_runtime!
14
+ Bundler.load.lock
15
+ end
16
+
17
+ spec = spec_for_gem(gem_name)
18
+
19
+ if spec
20
+ return print_gem_path(spec) if @options[:path]
21
+ return print_gem_version(spec) if @options[:version]
22
+ print_gem_info(spec)
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def spec_for_gem(name)
29
+ Bundler::CLI::Common.select_spec(name, :regex_match)
30
+ end
31
+
32
+ def print_gem_version(spec)
33
+ Bundler.ui.info spec.version.to_s
34
+ end
35
+
36
+ def print_gem_path(spec)
37
+ name = spec.name
38
+ if name == "bundler"
39
+ path = File.expand_path("../../..", __dir__)
40
+ else
41
+ path = spec.full_gem_path
42
+ if spec.installation_missing?
43
+ return Bundler.ui.warn "The gem #{name} is missing. It should be installed at #{path}, but was not found"
44
+ end
45
+ end
46
+
47
+ Bundler.ui.info path
48
+ end
49
+
50
+ def print_gem_info(spec)
51
+ metadata = spec.metadata
52
+ name = spec.name
53
+ gem_info = String.new
54
+ gem_info << " * #{name} (#{spec.version}#{spec.git_version})\n"
55
+ gem_info << "\tSummary: #{spec.summary}\n" if spec.summary
56
+ gem_info << "\tHomepage: #{spec.homepage}\n" if spec.homepage
57
+ gem_info << "\tDocumentation: #{metadata["documentation_uri"]}\n" if metadata.key?("documentation_uri")
58
+ gem_info << "\tSource Code: #{metadata["source_code_uri"]}\n" if metadata.key?("source_code_uri")
59
+ gem_info << "\tFunding: #{metadata["funding_uri"]}\n" if metadata.key?("funding_uri")
60
+ gem_info << "\tWiki: #{metadata["wiki_uri"]}\n" if metadata.key?("wiki_uri")
61
+ gem_info << "\tChangelog: #{metadata["changelog_uri"]}\n" if metadata.key?("changelog_uri")
62
+ gem_info << "\tBug Tracker: #{metadata["bug_tracker_uri"]}\n" if metadata.key?("bug_tracker_uri")
63
+ gem_info << "\tMailing List: #{metadata["mailing_list_uri"]}\n" if metadata.key?("mailing_list_uri")
64
+ gem_info << "\tPath: #{spec.full_gem_path}\n"
65
+ gem_info << "\tDefault Gem: yes\n" if spec.respond_to?(:default_gem?) && spec.default_gem?
66
+ gem_info << "\tReverse Dependencies: \n\t\t#{gem_dependencies.join("\n\t\t")}" if gem_dependencies.any?
67
+
68
+ if name != "bundler" && spec.installation_missing?
69
+ return Bundler.ui.warn "The gem #{name} is missing. Gemspec information is still available though:\n#{gem_info}"
70
+ end
71
+
72
+ Bundler.ui.info gem_info
73
+ end
74
+
75
+ def gem_dependencies
76
+ @gem_dependencies ||= Bundler.definition.specs.filter_map do |spec|
77
+ dependency = spec.dependencies.find {|dep| dep.name == gem_name }
78
+ next unless dependency
79
+ "#{spec.name} (#{spec.version}) depends on #{gem_name} (#{dependency.requirements_list.join(", ")})"
80
+ end.sort
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CLI::Init
5
+ attr_reader :options
6
+ def initialize(options)
7
+ @options = options
8
+ end
9
+
10
+ def run
11
+ if File.exist?(gemfile)
12
+ Bundler.ui.error "#{gemfile} already exists at #{File.expand_path(gemfile)}"
13
+ exit 1
14
+ end
15
+
16
+ unless File.writable?(Dir.pwd)
17
+ Bundler.ui.error "Can not create #{gemfile} as the current directory is not writable."
18
+ exit 1
19
+ end
20
+
21
+ if options[:gemspec]
22
+ gemspec = File.expand_path(options[:gemspec])
23
+ unless File.exist?(gemspec)
24
+ Bundler.ui.error "Gem specification #{gemspec} doesn't exist"
25
+ exit 1
26
+ end
27
+
28
+ spec = Bundler.load_gemspec_uncached(gemspec)
29
+
30
+ File.open(gemfile, "wb") do |file|
31
+ file << "# Generated from #{gemspec}\n"
32
+ file << spec.to_gemfile
33
+ end
34
+ else
35
+ File.open(File.expand_path("../templates/Gemfile", __dir__), "r") do |template|
36
+ File.open(gemfile, "wb") do |destination|
37
+ IO.copy_stream(template, destination)
38
+ end
39
+ end
40
+ end
41
+
42
+ puts "Writing new #{gemfile} to #{SharedHelpers.pwd}/#{gemfile}"
43
+ end
44
+
45
+ private
46
+
47
+ def gemfile
48
+ @gemfile ||= options[:gemfile] || Bundler.preferred_gemfile_name
49
+ end
50
+ end
51
+ end