bundler 2.2.29 → 2.5.16

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 (330) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1129 -4
  3. data/README.md +4 -8
  4. data/bundler.gemspec +11 -11
  5. data/exe/bundle +5 -26
  6. data/exe/bundler +1 -1
  7. data/lib/bundler/.document +1 -0
  8. data/lib/bundler/build_metadata.rb +4 -4
  9. data/lib/bundler/capistrano.rb +1 -1
  10. data/lib/bundler/checksum.rb +254 -0
  11. data/lib/bundler/ci_detector.rb +75 -0
  12. data/lib/bundler/cli/add.rb +4 -4
  13. data/lib/bundler/cli/binstubs.rb +10 -6
  14. data/lib/bundler/cli/cache.rb +1 -1
  15. data/lib/bundler/cli/check.rb +3 -3
  16. data/lib/bundler/cli/common.rb +13 -3
  17. data/lib/bundler/cli/config.rb +18 -8
  18. data/lib/bundler/cli/console.rb +5 -4
  19. data/lib/bundler/cli/doctor.rb +12 -5
  20. data/lib/bundler/cli/exec.rb +1 -1
  21. data/lib/bundler/cli/fund.rb +1 -1
  22. data/lib/bundler/cli/gem.rb +141 -48
  23. data/lib/bundler/cli/info.rb +27 -17
  24. data/lib/bundler/cli/init.rb +6 -2
  25. data/lib/bundler/cli/install.rb +22 -39
  26. data/lib/bundler/cli/issue.rb +5 -4
  27. data/lib/bundler/cli/lock.rb +36 -29
  28. data/lib/bundler/cli/open.rb +9 -9
  29. data/lib/bundler/cli/outdated.rb +19 -12
  30. data/lib/bundler/cli/platform.rb +8 -6
  31. data/lib/bundler/cli/plugin.rb +9 -15
  32. data/lib/bundler/cli/pristine.rb +38 -30
  33. data/lib/bundler/cli/show.rb +3 -3
  34. data/lib/bundler/cli/update.rb +12 -7
  35. data/lib/bundler/cli/viz.rb +1 -1
  36. data/lib/bundler/cli.rb +266 -285
  37. data/lib/bundler/compact_index_client/cache.rb +53 -67
  38. data/lib/bundler/compact_index_client/cache_file.rb +153 -0
  39. data/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  40. data/lib/bundler/compact_index_client/parser.rb +84 -0
  41. data/lib/bundler/compact_index_client/updater.rb +83 -76
  42. data/lib/bundler/compact_index_client.rb +59 -87
  43. data/lib/bundler/constants.rb +9 -2
  44. data/lib/bundler/current_ruby.rb +12 -16
  45. data/lib/bundler/definition.rb +509 -319
  46. data/lib/bundler/dependency.rb +33 -71
  47. data/lib/bundler/digest.rb +71 -0
  48. data/lib/bundler/dsl.rb +88 -69
  49. data/lib/bundler/endpoint_specification.rb +32 -15
  50. data/lib/bundler/env.rb +5 -7
  51. data/lib/bundler/environment_preserver.rb +8 -22
  52. data/lib/bundler/errors.rb +101 -13
  53. data/lib/bundler/feature_flag.rb +0 -2
  54. data/lib/bundler/fetcher/base.rb +11 -11
  55. data/lib/bundler/fetcher/compact_index.rb +32 -52
  56. data/lib/bundler/fetcher/dependency.rb +3 -7
  57. data/lib/bundler/fetcher/downloader.rb +17 -16
  58. data/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  59. data/lib/bundler/fetcher/index.rb +2 -29
  60. data/lib/bundler/fetcher.rb +87 -79
  61. data/lib/bundler/force_platform.rb +18 -0
  62. data/lib/bundler/friendly_errors.rb +29 -40
  63. data/lib/bundler/gem_helper.rb +11 -23
  64. data/lib/bundler/gem_helpers.rb +30 -6
  65. data/lib/bundler/gem_version_promoter.rb +68 -109
  66. data/lib/bundler/graph.rb +9 -9
  67. data/lib/bundler/index.rb +71 -79
  68. data/lib/bundler/injector.rb +23 -11
  69. data/lib/bundler/inline.rb +11 -23
  70. data/lib/bundler/installer/gem_installer.rb +18 -11
  71. data/lib/bundler/installer/parallel_installer.rb +17 -65
  72. data/lib/bundler/installer/standalone.rb +56 -15
  73. data/lib/bundler/installer.rb +35 -61
  74. data/lib/bundler/lazy_specification.rb +92 -61
  75. data/lib/bundler/lockfile_generator.rb +12 -3
  76. data/lib/bundler/lockfile_parser.rb +137 -70
  77. data/lib/bundler/man/bundle-add.1 +19 -26
  78. data/lib/bundler/man/bundle-add.1.ronn +16 -4
  79. data/lib/bundler/man/bundle-binstubs.1 +4 -16
  80. data/lib/bundler/man/bundle-cache.1 +9 -24
  81. data/lib/bundler/man/bundle-cache.1.ronn +9 -2
  82. data/lib/bundler/man/bundle-check.1 +5 -12
  83. data/lib/bundler/man/bundle-check.1.ronn +3 -0
  84. data/lib/bundler/man/bundle-clean.1 +4 -11
  85. data/lib/bundler/man/bundle-clean.1.ronn +1 -1
  86. data/lib/bundler/man/bundle-config.1 +47 -224
  87. data/lib/bundler/man/bundle-config.1.ronn +40 -28
  88. data/lib/bundler/man/bundle-console.1 +35 -0
  89. data/lib/bundler/man/bundle-console.1.ronn +44 -0
  90. data/lib/bundler/man/bundle-doctor.1 +4 -18
  91. data/lib/bundler/man/bundle-exec.1 +16 -77
  92. data/lib/bundler/man/bundle-exec.1.ronn +8 -9
  93. data/lib/bundler/man/bundle-gem.1 +45 -72
  94. data/lib/bundler/man/bundle-gem.1.ronn +32 -5
  95. data/lib/bundler/man/bundle-help.1 +9 -0
  96. data/lib/bundler/man/bundle-help.1.ronn +12 -0
  97. data/lib/bundler/man/bundle-info.1 +5 -11
  98. data/lib/bundler/man/bundle-info.1.ronn +3 -3
  99. data/lib/bundler/man/bundle-init.1 +6 -11
  100. data/lib/bundler/man/bundle-init.1.ronn +2 -0
  101. data/lib/bundler/man/bundle-inject.1 +8 -18
  102. data/lib/bundler/man/bundle-inject.1.ronn +3 -1
  103. data/lib/bundler/man/bundle-install.1 +32 -155
  104. data/lib/bundler/man/bundle-install.1.ronn +11 -33
  105. data/lib/bundler/man/bundle-list.1 +4 -19
  106. data/lib/bundler/man/bundle-lock.1 +5 -29
  107. data/lib/bundler/man/bundle-open.1 +18 -18
  108. data/lib/bundler/man/bundle-open.1.ronn +9 -1
  109. data/lib/bundler/man/bundle-outdated.1 +17 -72
  110. data/lib/bundler/man/bundle-outdated.1.ronn +13 -18
  111. data/lib/bundler/man/bundle-platform.1 +16 -28
  112. data/lib/bundler/man/bundle-platform.1.ronn +14 -7
  113. data/lib/bundler/man/bundle-plugin.1 +58 -0
  114. data/lib/bundler/man/bundle-plugin.1.ronn +63 -0
  115. data/lib/bundler/man/bundle-pristine.1 +5 -16
  116. data/lib/bundler/man/bundle-remove.1 +4 -14
  117. data/lib/bundler/man/bundle-show.1 +3 -10
  118. data/lib/bundler/man/bundle-update.1 +19 -138
  119. data/lib/bundler/man/bundle-update.1.ronn +2 -1
  120. data/lib/bundler/man/bundle-version.1 +22 -0
  121. data/lib/bundler/man/bundle-version.1.ronn +24 -0
  122. data/lib/bundler/man/bundle-viz.1 +6 -15
  123. data/lib/bundler/man/bundle-viz.1.ronn +2 -0
  124. data/lib/bundler/man/bundle.1 +17 -51
  125. data/lib/bundler/man/bundle.1.ronn +12 -7
  126. data/lib/bundler/man/gemfile.5 +130 -346
  127. data/lib/bundler/man/gemfile.5.ronn +121 -86
  128. data/lib/bundler/man/index.txt +4 -0
  129. data/lib/bundler/match_metadata.rb +17 -0
  130. data/lib/bundler/match_platform.rb +1 -2
  131. data/lib/bundler/match_remote_metadata.rb +29 -0
  132. data/lib/bundler/mirror.rb +8 -10
  133. data/lib/bundler/plugin/api/source.rb +9 -13
  134. data/lib/bundler/plugin/index.rb +13 -5
  135. data/lib/bundler/plugin/installer/git.rb +0 -4
  136. data/lib/bundler/plugin/installer/path.rb +18 -0
  137. data/lib/bundler/plugin/installer/rubygems.rb +0 -8
  138. data/lib/bundler/plugin/installer.rb +42 -19
  139. data/lib/bundler/plugin/source_list.rb +4 -4
  140. data/lib/bundler/plugin.rb +16 -7
  141. data/lib/bundler/process_lock.rb +1 -1
  142. data/lib/bundler/remote_specification.rb +11 -5
  143. data/lib/bundler/resolver/base.rb +111 -0
  144. data/lib/bundler/resolver/candidate.rb +82 -0
  145. data/lib/bundler/resolver/incompatibility.rb +15 -0
  146. data/lib/bundler/resolver/package.rb +81 -0
  147. data/lib/bundler/resolver/root.rb +25 -0
  148. data/lib/bundler/resolver/spec_group.rb +53 -66
  149. data/lib/bundler/resolver.rb +419 -307
  150. data/lib/bundler/retry.rb +1 -1
  151. data/lib/bundler/ruby_dsl.rb +42 -7
  152. data/lib/bundler/ruby_version.rb +16 -22
  153. data/lib/bundler/rubygems_ext.rb +250 -64
  154. data/lib/bundler/rubygems_gem_installer.rb +90 -64
  155. data/lib/bundler/rubygems_integration.rb +81 -190
  156. data/lib/bundler/runtime.rb +8 -13
  157. data/lib/bundler/safe_marshal.rb +31 -0
  158. data/lib/bundler/self_manager.rb +206 -0
  159. data/lib/bundler/settings.rb +139 -57
  160. data/lib/bundler/setup.rb +13 -1
  161. data/lib/bundler/shared_helpers.rb +67 -36
  162. data/lib/bundler/source/git/git_proxy.rb +285 -82
  163. data/lib/bundler/source/git.rb +81 -41
  164. data/lib/bundler/source/metadata.rb +17 -16
  165. data/lib/bundler/source/path/installer.rb +1 -22
  166. data/lib/bundler/source/path.rb +13 -25
  167. data/lib/bundler/source/rubygems/remote.rb +1 -1
  168. data/lib/bundler/source/rubygems.rb +164 -234
  169. data/lib/bundler/source/rubygems_aggregate.rb +1 -1
  170. data/lib/bundler/source.rb +7 -6
  171. data/lib/bundler/source_list.rb +40 -32
  172. data/lib/bundler/source_map.rb +15 -2
  173. data/lib/bundler/spec_set.rb +156 -46
  174. data/lib/bundler/stub_specification.rb +18 -5
  175. data/lib/bundler/templates/Executable +3 -5
  176. data/lib/bundler/templates/Executable.bundler +7 -12
  177. data/lib/bundler/templates/Executable.standalone +4 -4
  178. data/lib/bundler/templates/Gemfile +0 -2
  179. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
  180. data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  181. data/lib/bundler/templates/newgem/Gemfile.tt +8 -2
  182. data/lib/bundler/templates/newgem/README.md.tt +7 -11
  183. data/lib/bundler/templates/newgem/Rakefile.tt +28 -4
  184. data/lib/bundler/templates/newgem/bin/console.tt +0 -4
  185. data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  186. data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  187. data/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  188. data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  189. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  190. data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  191. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +13 -3
  192. data/lib/bundler/templates/newgem/gitignore.tt +3 -0
  193. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
  194. data/lib/bundler/templates/newgem/newgem.gemspec.tt +25 -17
  195. data/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
  196. data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  197. data/lib/bundler/templates/newgem/standard.yml.tt +3 -0
  198. data/lib/bundler/templates/newgem/test/minitest/{newgem_test.rb.tt → test_newgem.rb.tt} +1 -1
  199. data/lib/bundler/ui/rg_proxy.rb +1 -1
  200. data/lib/bundler/ui/shell.rb +38 -15
  201. data/lib/bundler/ui/silent.rb +21 -5
  202. data/lib/bundler/uri_credentials_filter.rb +2 -2
  203. data/lib/bundler/uri_normalizer.rb +23 -0
  204. data/lib/bundler/vendor/.document +1 -0
  205. data/lib/bundler/vendor/connection_pool/.document +1 -0
  206. data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
  207. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +19 -21
  208. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  209. data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
  210. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +92 -78
  211. data/lib/bundler/vendor/fileutils/.document +1 -0
  212. data/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
  213. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1340 -410
  214. data/lib/bundler/vendor/net-http-persistent/.document +1 -0
  215. data/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
  216. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
  217. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
  218. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  219. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +57 -57
  220. data/lib/bundler/vendor/pub_grub/.document +1 -0
  221. data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  222. data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  223. data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  224. data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  225. data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  226. data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  227. data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  228. data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  229. data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  230. data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +61 -0
  231. data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  232. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  233. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  234. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  235. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  236. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  237. data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  238. data/lib/bundler/vendor/thor/.document +1 -0
  239. data/lib/bundler/vendor/thor/LICENSE.md +20 -0
  240. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  241. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  242. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
  243. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +12 -14
  244. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +16 -6
  245. data/lib/bundler/vendor/thor/lib/thor/actions.rb +21 -17
  246. data/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
  247. data/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
  248. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +10 -0
  249. data/lib/bundler/vendor/thor/lib/thor/error.rb +16 -20
  250. data/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
  251. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
  252. data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
  253. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +20 -1
  254. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
  255. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +27 -8
  256. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +63 -7
  257. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
  258. data/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
  259. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +48 -154
  260. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -46
  261. data/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  262. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +0 -45
  263. data/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
  264. data/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  265. data/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  266. data/lib/bundler/vendor/thor/lib/thor/shell.rb +2 -2
  267. data/lib/bundler/vendor/thor/lib/thor/util.rb +9 -8
  268. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  269. data/lib/bundler/vendor/thor/lib/thor.rb +155 -8
  270. data/lib/bundler/vendor/tsort/.document +1 -0
  271. data/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
  272. data/lib/bundler/vendor/tsort/lib/tsort.rb +455 -0
  273. data/lib/bundler/vendor/uri/.document +1 -0
  274. data/lib/bundler/vendor/uri/LICENSE.txt +22 -0
  275. data/lib/bundler/vendor/uri/lib/uri/common.rb +316 -207
  276. data/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
  277. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -2
  278. data/lib/bundler/vendor/uri/lib/uri/generic.rb +33 -13
  279. data/lib/bundler/vendor/uri/lib/uri/http.rb +40 -3
  280. data/lib/bundler/vendor/uri/lib/uri/https.rb +2 -2
  281. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +2 -2
  282. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  283. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -3
  284. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +16 -23
  285. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +105 -47
  286. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  287. data/lib/bundler/vendor/uri/lib/uri/ws.rb +83 -0
  288. data/lib/bundler/vendor/uri/lib/uri/wss.rb +23 -0
  289. data/lib/bundler/vendor/uri/lib/uri.rb +3 -3
  290. data/lib/bundler/vendored_net_http.rb +23 -0
  291. data/lib/bundler/vendored_persistent.rb +0 -36
  292. data/lib/bundler/{vendored_molinillo.rb → vendored_pub_grub.rb} +1 -1
  293. data/lib/bundler/vendored_timeout.rb +12 -0
  294. data/lib/bundler/{vendored_tmpdir.rb → vendored_tsort.rb} +1 -1
  295. data/lib/bundler/vendored_uri.rb +18 -1
  296. data/lib/bundler/version.rb +5 -1
  297. data/lib/bundler/vlad.rb +1 -1
  298. data/lib/bundler/worker.rb +7 -9
  299. data/lib/bundler/yaml_serializer.rb +21 -12
  300. data/lib/bundler.rb +114 -121
  301. metadata +87 -41
  302. data/lib/bundler/dep_proxy.rb +0 -55
  303. data/lib/bundler/gemdeps.rb +0 -29
  304. data/lib/bundler/psyched_yaml.rb +0 -22
  305. data/lib/bundler/templates/gems.rb +0 -8
  306. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
  307. data/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  308. data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +0 -66
  309. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  310. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  311. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  312. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  313. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  314. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  315. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  316. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  317. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  318. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  319. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  320. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  321. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -143
  322. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  323. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  324. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  325. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  326. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  327. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  328. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
  329. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  330. data/lib/bundler/version_ranges.rb +0 -122
@@ -1,5 +1,5 @@
1
1
  class Bundler::Thor
2
- class Options < Arguments #:nodoc: # rubocop:disable ClassLength
2
+ class Options < Arguments #:nodoc:
3
3
  LONG_RE = /^(--\w+(?:-\w+)*)$/
4
4
  SHORT_RE = /^(-[a-z])$/i
5
5
  EQ_RE = /^(--\w+(?:-\w+)*|-[a-z])=(.*)$/i
@@ -29,8 +29,10 @@ class Bundler::Thor
29
29
  #
30
30
  # If +stop_on_unknown+ is true, #parse will stop as soon as it encounters
31
31
  # an unknown option or a regular argument.
32
- def initialize(hash_options = {}, defaults = {}, stop_on_unknown = false, disable_required_check = false)
32
+ def initialize(hash_options = {}, defaults = {}, stop_on_unknown = false, disable_required_check = false, relations = {})
33
33
  @stop_on_unknown = stop_on_unknown
34
+ @exclusives = (relations[:exclusive_option_names] || []).select{|array| !array.empty?}
35
+ @at_least_ones = (relations[:at_least_one_option_names] || []).select{|array| !array.empty?}
34
36
  @disable_required_check = disable_required_check
35
37
  options = hash_options.values
36
38
  super(options)
@@ -45,12 +47,12 @@ class Bundler::Thor
45
47
  @switches = {}
46
48
  @extra = []
47
49
  @stopped_parsing_after_extra_index = nil
50
+ @is_treated_as_value = false
48
51
 
49
52
  options.each do |option|
50
53
  @switches[option.switch_name] = option
51
54
 
52
- option.aliases.each do |short|
53
- name = short.to_s.sub(/^(?!\-)/, "-")
55
+ option.aliases.each do |name|
54
56
  @shorts[name] ||= option.switch_name
55
57
  end
56
58
  end
@@ -74,8 +76,19 @@ class Bundler::Thor
74
76
  end
75
77
  end
76
78
 
77
- def parse(args) # rubocop:disable MethodLength
79
+ def shift
80
+ @is_treated_as_value = false
81
+ super
82
+ end
83
+
84
+ def unshift(arg, is_value: false)
85
+ @is_treated_as_value = is_value
86
+ super(arg)
87
+ end
88
+
89
+ def parse(args) # rubocop:disable Metrics/MethodLength
78
90
  @pile = args.dup
91
+ @is_treated_as_value = false
79
92
  @parsing_options = true
80
93
 
81
94
  while peek
@@ -88,7 +101,10 @@ class Bundler::Thor
88
101
  when SHORT_SQ_RE
89
102
  unshift($1.split("").map { |f| "-#{f}" })
90
103
  next
91
- when EQ_RE, SHORT_NUM
104
+ when EQ_RE
105
+ unshift($2, is_value: true)
106
+ switch = $1
107
+ when SHORT_NUM
92
108
  unshift($2)
93
109
  switch = $1
94
110
  when LONG_RE, SHORT_RE
@@ -117,12 +133,38 @@ class Bundler::Thor
117
133
  end
118
134
 
119
135
  check_requirement! unless @disable_required_check
136
+ check_exclusive!
137
+ check_at_least_one!
120
138
 
121
139
  assigns = Bundler::Thor::CoreExt::HashWithIndifferentAccess.new(@assigns)
122
140
  assigns.freeze
123
141
  assigns
124
142
  end
125
143
 
144
+ def check_exclusive!
145
+ opts = @assigns.keys
146
+ # When option A and B are exclusive, if A and B are given at the same time,
147
+ # the diffrence of argument array size will decrease.
148
+ found = @exclusives.find{ |ex| (ex - opts).size < ex.size - 1 }
149
+ if found
150
+ names = names_to_switch_names(found & opts).map{|n| "'#{n}'"}
151
+ class_name = self.class.name.split("::").last.downcase
152
+ fail ExclusiveArgumentError, "Found exclusive #{class_name} #{names.join(", ")}"
153
+ end
154
+ end
155
+
156
+ def check_at_least_one!
157
+ opts = @assigns.keys
158
+ # When at least one is required of the options A and B,
159
+ # if the both options were not given, none? would be true.
160
+ found = @at_least_ones.find{ |one_reqs| one_reqs.none?{ |o| opts.include? o} }
161
+ if found
162
+ names = names_to_switch_names(found).map{|n| "'#{n}'"}
163
+ class_name = self.class.name.split("::").last.downcase
164
+ fail AtLeastOneRequiredArgumentError, "Not found at least one of required #{class_name} #{names.join(", ")}"
165
+ end
166
+ end
167
+
126
168
  def check_unknown!
127
169
  to_check = @stopped_parsing_after_extra_index ? @extra[0...@stopped_parsing_after_extra_index] : @extra
128
170
 
@@ -133,6 +175,17 @@ class Bundler::Thor
133
175
 
134
176
  protected
135
177
 
178
+ # Option names changes to swith name or human name
179
+ def names_to_switch_names(names = [])
180
+ @switches.map do |_, o|
181
+ if names.include? o.name
182
+ o.respond_to?(:switch_name) ? o.switch_name : o.human_name
183
+ else
184
+ nil
185
+ end
186
+ end.compact
187
+ end
188
+
136
189
  def assign_result!(option, result)
137
190
  if option.repeatable && option.type == :hash
138
191
  (@assigns[option.human_name] ||= {}).merge!(result)
@@ -148,6 +201,7 @@ class Bundler::Thor
148
201
  # Two booleans are returned. The first is true if the current value
149
202
  # starts with a hyphen; the second is true if it is a registered switch.
150
203
  def current_is_switch?
204
+ return [false, false] if @is_treated_as_value
151
205
  case peek
152
206
  when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM
153
207
  [true, switch?($1)]
@@ -159,6 +213,7 @@ class Bundler::Thor
159
213
  end
160
214
 
161
215
  def current_is_switch_formatted?
216
+ return false if @is_treated_as_value
162
217
  case peek
163
218
  when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM, SHORT_SQ_RE
164
219
  true
@@ -168,6 +223,7 @@ class Bundler::Thor
168
223
  end
169
224
 
170
225
  def current_is_value?
226
+ return true if @is_treated_as_value
171
227
  peek && (!parsing_options? || super)
172
228
  end
173
229
 
@@ -176,7 +232,7 @@ class Bundler::Thor
176
232
  end
177
233
 
178
234
  def switch_option(arg)
179
- if match = no_or_skip?(arg) # rubocop:disable AssignmentInCondition
235
+ if match = no_or_skip?(arg) # rubocop:disable Lint/AssignmentInCondition
180
236
  @switches[arg] || @switches["--#{match}"]
181
237
  else
182
238
  @switches[arg]
@@ -41,7 +41,7 @@ instance_eval do
41
41
  def task(*)
42
42
  task = super
43
43
 
44
- if klass = Bundler::Thor::RakeCompat.rake_classes.last # rubocop:disable AssignmentInCondition
44
+ if klass = Bundler::Thor::RakeCompat.rake_classes.last # rubocop:disable Lint/AssignmentInCondition
45
45
  non_namespaced_name = task.name.split(":").last
46
46
 
47
47
  description = non_namespaced_name
@@ -59,7 +59,7 @@ instance_eval do
59
59
  end
60
60
 
61
61
  def namespace(name)
62
- if klass = Bundler::Thor::RakeCompat.rake_classes.last # rubocop:disable AssignmentInCondition
62
+ if klass = Bundler::Thor::RakeCompat.rake_classes.last # rubocop:disable Lint/AssignmentInCondition
63
63
  const_name = Bundler::Thor::Util.camel_case(name.to_s).to_sym
64
64
  klass.const_set(const_name, Class.new(Bundler::Thor))
65
65
  new_klass = klass.const_get(const_name)
@@ -2,12 +2,10 @@ require_relative "../thor"
2
2
  require_relative "group"
3
3
 
4
4
  require "yaml"
5
- require "digest/md5"
5
+ require "digest/sha2"
6
6
  require "pathname"
7
7
 
8
- class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLength
9
- autoload :OpenURI, "open-uri"
10
-
8
+ class Bundler::Thor::Runner < Bundler::Thor #:nodoc:
11
9
  map "-T" => :list, "-i" => :install, "-u" => :update, "-v" => :version
12
10
 
13
11
  def self.banner(command, all = false, subcommand = false)
@@ -25,7 +23,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
25
23
  initialize_thorfiles(meth)
26
24
  klass, command = Bundler::Thor::Util.find_class_and_command_by_namespace(meth)
27
25
  self.class.handle_no_command_error(command, false) if klass.nil?
28
- klass.start(["-h", command].compact, :shell => shell)
26
+ klass.start(["-h", command].compact, shell: shell)
29
27
  else
30
28
  super
31
29
  end
@@ -40,30 +38,42 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
40
38
  klass, command = Bundler::Thor::Util.find_class_and_command_by_namespace(meth)
41
39
  self.class.handle_no_command_error(command, false) if klass.nil?
42
40
  args.unshift(command) if command
43
- klass.start(args, :shell => shell)
41
+ klass.start(args, shell: shell)
44
42
  end
45
43
 
46
44
  desc "install NAME", "Install an optionally named Bundler::Thor file into your system commands"
47
- method_options :as => :string, :relative => :boolean, :force => :boolean
48
- def install(name) # rubocop:disable MethodLength
45
+ method_options as: :string, relative: :boolean, force: :boolean
46
+ def install(name) # rubocop:disable Metrics/MethodLength
49
47
  initialize_thorfiles
50
48
 
51
- # If a directory name is provided as the argument, look for a 'main.thor'
52
- # command in said directory.
53
- begin
54
- if File.directory?(File.expand_path(name))
55
- base = File.join(name, "main.thor")
56
- package = :directory
57
- contents = open(base, &:read)
58
- else
59
- base = name
60
- package = :file
61
- contents = open(name, &:read)
49
+ is_uri = name =~ %r{^https?\://}
50
+
51
+ if is_uri
52
+ base = name
53
+ package = :file
54
+ require "open-uri"
55
+ begin
56
+ contents = URI.open(name, &:read)
57
+ rescue OpenURI::HTTPError
58
+ raise Error, "Error opening URI '#{name}'"
59
+ end
60
+ else
61
+ # If a directory name is provided as the argument, look for a 'main.thor'
62
+ # command in said directory.
63
+ begin
64
+ if File.directory?(File.expand_path(name))
65
+ base = File.join(name, "main.thor")
66
+ package = :directory
67
+ contents = File.open(base, &:read)
68
+ else
69
+ base = name
70
+ package = :file
71
+ require "open-uri"
72
+ contents = URI.open(name, &:read)
73
+ end
74
+ rescue Errno::ENOENT
75
+ raise Error, "Error opening file '#{name}'"
62
76
  end
63
- rescue OpenURI::HTTPError
64
- raise Error, "Error opening URI '#{name}'"
65
- rescue Errno::ENOENT
66
- raise Error, "Error opening file '#{name}'"
67
77
  end
68
78
 
69
79
  say "Your Thorfile contains:"
@@ -84,16 +94,16 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
84
94
  as = basename if as.empty?
85
95
  end
86
96
 
87
- location = if options[:relative] || name =~ %r{^https?://}
97
+ location = if options[:relative] || is_uri
88
98
  name
89
99
  else
90
100
  File.expand_path(name)
91
101
  end
92
102
 
93
103
  thor_yaml[as] = {
94
- :filename => Digest::MD5.hexdigest(name + as),
95
- :location => location,
96
- :namespaces => Bundler::Thor::Util.namespaces_in_content(contents, base)
104
+ filename: Digest::SHA256.hexdigest(name + as),
105
+ location: location,
106
+ namespaces: Bundler::Thor::Util.namespaces_in_content(contents, base)
97
107
  }
98
108
 
99
109
  save_yaml(thor_yaml)
@@ -154,14 +164,14 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
154
164
  end
155
165
 
156
166
  desc "installed", "List the installed Bundler::Thor modules and commands"
157
- method_options :internal => :boolean
167
+ method_options internal: :boolean
158
168
  def installed
159
169
  initialize_thorfiles(nil, true)
160
170
  display_klasses(true, options["internal"])
161
171
  end
162
172
 
163
173
  desc "list [SEARCH]", "List the available thor commands (--substring means .*SEARCH)"
164
- method_options :substring => :boolean, :group => :string, :all => :boolean, :debug => :boolean
174
+ method_options substring: :boolean, group: :string, all: :boolean, debug: :boolean
165
175
  def list(search = "")
166
176
  initialize_thorfiles
167
177
 
@@ -303,7 +313,7 @@ private
303
313
  say shell.set_color(namespace, :blue, true)
304
314
  say "-" * namespace.size
305
315
 
306
- print_table(list, :truncate => true)
316
+ print_table(list, truncate: true)
307
317
  say
308
318
  end
309
319
  alias_method :display_tasks, :display_commands
@@ -1,8 +1,10 @@
1
+ require_relative "column_printer"
2
+ require_relative "table_printer"
3
+ require_relative "wrapped_printer"
4
+
1
5
  class Bundler::Thor
2
6
  module Shell
3
7
  class Basic
4
- DEFAULT_TERMINAL_WIDTH = 80
5
-
6
8
  attr_accessor :base
7
9
  attr_reader :padding
8
10
 
@@ -103,6 +105,23 @@ class Bundler::Thor
103
105
  stdout.flush
104
106
  end
105
107
 
108
+ # Say (print) an error to the user. If the sentence ends with a whitespace
109
+ # or tab character, a new line is not appended (print + flush). Otherwise
110
+ # are passed straight to puts (behavior got from Highline).
111
+ #
112
+ # ==== Example
113
+ # say_error("error: something went wrong")
114
+ #
115
+ def say_error(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/))
116
+ return if quiet?
117
+
118
+ buffer = prepare_message(message, *color)
119
+ buffer << "\n" if force_new_line && !message.to_s.end_with?("\n")
120
+
121
+ stderr.print(buffer)
122
+ stderr.flush
123
+ end
124
+
106
125
  # Say a status with the given color and appends the message. Since this
107
126
  # method is used frequently by actions, it allows nil or false to be given
108
127
  # in log_status, avoiding the message from being shown. If a Symbol is
@@ -111,13 +130,14 @@ class Bundler::Thor
111
130
  def say_status(status, message, log_status = true)
112
131
  return if quiet? || log_status == false
113
132
  spaces = " " * (padding + 1)
114
- color = log_status.is_a?(Symbol) ? log_status : :green
115
-
116
133
  status = status.to_s.rjust(12)
134
+ margin = " " * status.length + spaces
135
+
136
+ color = log_status.is_a?(Symbol) ? log_status : :green
117
137
  status = set_color status, color, true if color
118
138
 
119
- buffer = "#{status}#{spaces}#{message}"
120
- buffer = "#{buffer}\n" unless buffer.end_with?("\n")
139
+ message = message.to_s.chomp.gsub(/(?<!\A)^/, margin)
140
+ buffer = "#{status}#{spaces}#{message}\n"
121
141
 
122
142
  stdout.print(buffer)
123
143
  stdout.flush
@@ -127,14 +147,14 @@ class Bundler::Thor
127
147
  # "yes".
128
148
  #
129
149
  def yes?(statement, color = nil)
130
- !!(ask(statement, color, :add_to_history => false) =~ is?(:yes))
150
+ !!(ask(statement, color, add_to_history: false) =~ is?(:yes))
131
151
  end
132
152
 
133
153
  # Make a question the to user and returns true if the user replies "n" or
134
154
  # "no".
135
155
  #
136
156
  def no?(statement, color = nil)
137
- !!(ask(statement, color, :add_to_history => false) =~ is?(:no))
157
+ !!(ask(statement, color, add_to_history: false) =~ is?(:no))
138
158
  end
139
159
 
140
160
  # Prints values in columns
@@ -143,16 +163,8 @@ class Bundler::Thor
143
163
  # Array[String, String, ...]
144
164
  #
145
165
  def print_in_columns(array)
146
- return if array.empty?
147
- colwidth = (array.map { |el| el.to_s.size }.max || 0) + 2
148
- array.each_with_index do |value, index|
149
- # Don't output trailing spaces when printing the last column
150
- if ((((index + 1) % (terminal_width / colwidth))).zero? && !index.zero?) || index + 1 == array.length
151
- stdout.puts value
152
- else
153
- stdout.printf("%-#{colwidth}s", value)
154
- end
155
- end
166
+ printer = ColumnPrinter.new(stdout)
167
+ printer.print(array)
156
168
  end
157
169
 
158
170
  # Prints a table.
@@ -163,58 +175,11 @@ class Bundler::Thor
163
175
  # ==== Options
164
176
  # indent<Integer>:: Indent the first column by indent value.
165
177
  # colwidth<Integer>:: Force the first column to colwidth spaces wide.
178
+ # borders<Boolean>:: Adds ascii borders.
166
179
  #
167
- def print_table(array, options = {}) # rubocop:disable MethodLength
168
- return if array.empty?
169
-
170
- formats = []
171
- indent = options[:indent].to_i
172
- colwidth = options[:colwidth]
173
- options[:truncate] = terminal_width if options[:truncate] == true
174
-
175
- formats << "%-#{colwidth + 2}s".dup if colwidth
176
- start = colwidth ? 1 : 0
177
-
178
- colcount = array.max { |a, b| a.size <=> b.size }.size
179
-
180
- maximas = []
181
-
182
- start.upto(colcount - 1) do |index|
183
- maxima = array.map { |row| row[index] ? row[index].to_s.size : 0 }.max
184
- maximas << maxima
185
- formats << if index == colcount - 1
186
- # Don't output 2 trailing spaces when printing the last column
187
- "%-s".dup
188
- else
189
- "%-#{maxima + 2}s".dup
190
- end
191
- end
192
-
193
- formats[0] = formats[0].insert(0, " " * indent)
194
- formats << "%s"
195
-
196
- array.each do |row|
197
- sentence = "".dup
198
-
199
- row.each_with_index do |column, index|
200
- maxima = maximas[index]
201
-
202
- f = if column.is_a?(Numeric)
203
- if index == row.size - 1
204
- # Don't output 2 trailing spaces when printing the last column
205
- "%#{maxima}s"
206
- else
207
- "%#{maxima}s "
208
- end
209
- else
210
- formats[index]
211
- end
212
- sentence << f % column.to_s
213
- end
214
-
215
- sentence = truncate(sentence, options[:truncate]) if options[:truncate]
216
- stdout.puts sentence
217
- end
180
+ def print_table(array, options = {}) # rubocop:disable Metrics/MethodLength
181
+ printer = TablePrinter.new(stdout, options)
182
+ printer.print(array)
218
183
  end
219
184
 
220
185
  # Prints a long string, word-wrapping the text to the current width of the
@@ -227,33 +192,8 @@ class Bundler::Thor
227
192
  # indent<Integer>:: Indent each line of the printed paragraph by indent value.
228
193
  #
229
194
  def print_wrapped(message, options = {})
230
- indent = options[:indent] || 0
231
- width = terminal_width - indent
232
- paras = message.split("\n\n")
233
-
234
- paras.map! do |unwrapped|
235
- words = unwrapped.split(" ")
236
- counter = words.first.length
237
- words.inject do |memo, word|
238
- word = word.gsub(/\n\005/, "\n").gsub(/\005/, "\n")
239
- counter = 0 if word.include? "\n"
240
- if (counter + word.length + 1) < width
241
- memo = "#{memo} #{word}"
242
- counter += (word.length + 1)
243
- else
244
- memo = "#{memo}\n#{word}"
245
- counter = word.length
246
- end
247
- memo
248
- end
249
- end.compact!
250
-
251
- paras.each do |para|
252
- para.split("\n").each do |line|
253
- stdout.puts line.insert(0, " " * indent)
254
- end
255
- stdout.puts unless para == paras.last
256
- end
195
+ printer = WrappedPrinter.new(stdout, options)
196
+ printer.print(message)
257
197
  end
258
198
 
259
199
  # Deals with file collision and returns true if the file should be
@@ -271,7 +211,7 @@ class Bundler::Thor
271
211
  loop do
272
212
  answer = ask(
273
213
  %[Overwrite #{destination}? (enter "h" for help) #{options}],
274
- :add_to_history => false
214
+ add_to_history: false
275
215
  )
276
216
 
277
217
  case answer
@@ -298,24 +238,11 @@ class Bundler::Thor
298
238
 
299
239
  say "Please specify merge tool to `THOR_MERGE` env."
300
240
  else
301
- say file_collision_help
241
+ say file_collision_help(block_given?)
302
242
  end
303
243
  end
304
244
  end
305
245
 
306
- # This code was copied from Rake, available under MIT-LICENSE
307
- # Copyright (c) 2003, 2004 Jim Weirich
308
- def terminal_width
309
- result = if ENV["THOR_COLUMNS"]
310
- ENV["THOR_COLUMNS"].to_i
311
- else
312
- unix? ? dynamic_width : DEFAULT_TERMINAL_WIDTH
313
- end
314
- result < 10 ? DEFAULT_TERMINAL_WIDTH : result
315
- rescue
316
- DEFAULT_TERMINAL_WIDTH
317
- end
318
-
319
246
  # Called if something goes wrong during the execution. This is used by Bundler::Thor
320
247
  # internally and should not be used inside your scripts. If something went
321
248
  # wrong, you can always raise an exception. If you raise a Bundler::Thor::Error, it
@@ -366,16 +293,21 @@ class Bundler::Thor
366
293
  end
367
294
  end
368
295
 
369
- def file_collision_help #:nodoc:
370
- <<-HELP
296
+ def file_collision_help(block_given) #:nodoc:
297
+ help = <<-HELP
371
298
  Y - yes, overwrite
372
299
  n - no, do not overwrite
373
300
  a - all, overwrite this and all others
374
301
  q - quit, abort
375
- d - diff, show the differences between the old and the new
376
302
  h - help, show this help
377
- m - merge, run merge tool
378
303
  HELP
304
+ if block_given
305
+ help << <<-HELP
306
+ d - diff, show the differences between the old and the new
307
+ m - merge, run merge tool
308
+ HELP
309
+ end
310
+ help
379
311
  end
380
312
 
381
313
  def show_diff(destination, content) #:nodoc:
@@ -393,46 +325,8 @@ class Bundler::Thor
393
325
  mute? || (base && base.options[:quiet])
394
326
  end
395
327
 
396
- # Calculate the dynamic width of the terminal
397
- def dynamic_width
398
- @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
399
- end
400
-
401
- def dynamic_width_stty
402
- `stty size 2>/dev/null`.split[1].to_i
403
- end
404
-
405
- def dynamic_width_tput
406
- `tput cols 2>/dev/null`.to_i
407
- end
408
-
409
328
  def unix?
410
- RUBY_PLATFORM =~ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
411
- end
412
-
413
- def truncate(string, width)
414
- as_unicode do
415
- chars = string.chars.to_a
416
- if chars.length <= width
417
- chars.join
418
- else
419
- chars[0, width - 3].join + "..."
420
- end
421
- end
422
- end
423
-
424
- if "".respond_to?(:encode)
425
- def as_unicode
426
- yield
427
- end
428
- else
429
- def as_unicode
430
- old = $KCODE
431
- $KCODE = "U"
432
- yield
433
- ensure
434
- $KCODE = old
435
- end
329
+ Terminal.unix?
436
330
  end
437
331
 
438
332
  def ask_simply(statement, color, options)
@@ -105,52 +105,7 @@ class Bundler::Thor
105
105
  end
106
106
 
107
107
  def are_colors_disabled?
108
- !ENV['NO_COLOR'].nil?
109
- end
110
-
111
- # Overwrite show_diff to show diff with colors if Diff::LCS is
112
- # available.
113
- #
114
- def show_diff(destination, content) #:nodoc:
115
- if diff_lcs_loaded? && ENV["THOR_DIFF"].nil? && ENV["RAILS_DIFF"].nil?
116
- actual = File.binread(destination).to_s.split("\n")
117
- content = content.to_s.split("\n")
118
-
119
- Diff::LCS.sdiff(actual, content).each do |diff|
120
- output_diff_line(diff)
121
- end
122
- else
123
- super
124
- end
125
- end
126
-
127
- def output_diff_line(diff) #:nodoc:
128
- case diff.action
129
- when "-"
130
- say "- #{diff.old_element.chomp}", :red, true
131
- when "+"
132
- say "+ #{diff.new_element.chomp}", :green, true
133
- when "!"
134
- say "- #{diff.old_element.chomp}", :red, true
135
- say "+ #{diff.new_element.chomp}", :green, true
136
- else
137
- say " #{diff.old_element.chomp}", nil, true
138
- end
139
- end
140
-
141
- # Check if Diff::LCS is loaded. If it is, use it to create pretty output
142
- # for diff.
143
- #
144
- def diff_lcs_loaded? #:nodoc:
145
- return true if defined?(Diff::LCS)
146
- return @diff_lcs_loaded unless @diff_lcs_loaded.nil?
147
-
148
- @diff_lcs_loaded = begin
149
- require "diff/lcs"
150
- true
151
- rescue LoadError
152
- false
153
- end
108
+ !ENV["NO_COLOR"].nil? && !ENV["NO_COLOR"].empty?
154
109
  end
155
110
  end
156
111
  end
@@ -0,0 +1,29 @@
1
+ require_relative "terminal"
2
+
3
+ class Bundler::Thor
4
+ module Shell
5
+ class ColumnPrinter
6
+ attr_reader :stdout, :options
7
+
8
+ def initialize(stdout, options = {})
9
+ @stdout = stdout
10
+ @options = options
11
+ @indent = options[:indent].to_i
12
+ end
13
+
14
+ def print(array)
15
+ return if array.empty?
16
+ colwidth = (array.map { |el| el.to_s.size }.max || 0) + 2
17
+ array.each_with_index do |value, index|
18
+ # Don't output trailing spaces when printing the last column
19
+ if ((((index + 1) % (Terminal.terminal_width / colwidth))).zero? && !index.zero?) || index + 1 == array.length
20
+ stdout.puts value
21
+ else
22
+ stdout.printf("%-#{colwidth}s", value)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+