bundler 1.13.6 → 1.17.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bundler might be problematic. Click here for more details.

Files changed (323) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +554 -9
  3. data/README.md +28 -5
  4. data/bundler.gemspec +40 -11
  5. data/exe/bundle +4 -8
  6. data/exe/bundle_ruby +4 -3
  7. data/lib/bundler.rb +162 -68
  8. data/lib/bundler/build_metadata.rb +53 -0
  9. data/lib/bundler/capistrano.rb +5 -0
  10. data/lib/bundler/cli.rb +360 -118
  11. data/lib/bundler/cli/add.rb +35 -0
  12. data/lib/bundler/cli/binstubs.rb +18 -10
  13. data/lib/bundler/cli/cache.rb +6 -5
  14. data/lib/bundler/cli/check.rb +4 -6
  15. data/lib/bundler/cli/clean.rb +6 -7
  16. data/lib/bundler/cli/common.rb +47 -1
  17. data/lib/bundler/cli/config.rb +26 -7
  18. data/lib/bundler/cli/console.rb +2 -1
  19. data/lib/bundler/cli/doctor.rb +63 -18
  20. data/lib/bundler/cli/exec.rb +12 -5
  21. data/lib/bundler/cli/gem.rb +59 -21
  22. data/lib/bundler/cli/info.rb +50 -0
  23. data/lib/bundler/cli/init.rb +21 -7
  24. data/lib/bundler/cli/inject.rb +13 -4
  25. data/lib/bundler/cli/install.rb +72 -101
  26. data/lib/bundler/cli/issue.rb +40 -0
  27. data/lib/bundler/cli/list.rb +58 -0
  28. data/lib/bundler/cli/lock.rb +9 -6
  29. data/lib/bundler/cli/open.rb +4 -3
  30. data/lib/bundler/cli/outdated.rb +175 -60
  31. data/lib/bundler/cli/package.rb +9 -6
  32. data/lib/bundler/cli/platform.rb +2 -1
  33. data/lib/bundler/cli/plugin.rb +1 -0
  34. data/lib/bundler/cli/pristine.rb +47 -0
  35. data/lib/bundler/cli/remove.rb +18 -0
  36. data/lib/bundler/cli/show.rb +2 -2
  37. data/lib/bundler/cli/update.rb +44 -34
  38. data/lib/bundler/cli/viz.rb +5 -1
  39. data/lib/bundler/compact_index_client.rb +109 -0
  40. data/lib/bundler/compact_index_client/cache.rb +118 -0
  41. data/lib/bundler/compact_index_client/updater.rb +116 -0
  42. data/lib/bundler/compatibility_guard.rb +14 -0
  43. data/lib/bundler/constants.rb +1 -0
  44. data/lib/bundler/current_ruby.rb +17 -8
  45. data/lib/bundler/definition.rb +353 -182
  46. data/lib/bundler/dep_proxy.rb +3 -1
  47. data/lib/bundler/dependency.rb +22 -10
  48. data/lib/bundler/deployment.rb +1 -1
  49. data/lib/bundler/deprecate.rb +15 -3
  50. data/lib/bundler/dsl.rb +122 -64
  51. data/lib/bundler/endpoint_specification.rb +13 -3
  52. data/lib/bundler/env.rb +110 -38
  53. data/lib/bundler/environment_preserver.rb +27 -6
  54. data/lib/bundler/errors.rb +24 -0
  55. data/lib/bundler/feature_flag.rb +74 -0
  56. data/lib/bundler/fetcher.rb +18 -11
  57. data/lib/bundler/fetcher/base.rb +1 -0
  58. data/lib/bundler/fetcher/compact_index.rb +7 -5
  59. data/lib/bundler/fetcher/dependency.rb +3 -2
  60. data/lib/bundler/fetcher/downloader.rb +25 -7
  61. data/lib/bundler/fetcher/index.rb +3 -2
  62. data/lib/bundler/friendly_errors.rb +33 -7
  63. data/lib/bundler/gem_helper.rb +25 -11
  64. data/lib/bundler/gem_helpers.rb +70 -1
  65. data/lib/bundler/gem_remote_fetcher.rb +1 -0
  66. data/lib/bundler/gem_tasks.rb +1 -0
  67. data/lib/bundler/gem_version_promoter.rb +17 -2
  68. data/lib/bundler/gemdeps.rb +29 -0
  69. data/lib/bundler/graph.rb +1 -0
  70. data/lib/bundler/index.rb +28 -15
  71. data/lib/bundler/injector.rb +216 -33
  72. data/lib/bundler/inline.rb +12 -12
  73. data/lib/bundler/installer.rb +139 -53
  74. data/lib/bundler/installer/gem_installer.rb +15 -5
  75. data/lib/bundler/installer/parallel_installer.rb +113 -28
  76. data/lib/bundler/installer/standalone.rb +1 -0
  77. data/lib/bundler/lazy_specification.rb +31 -3
  78. data/lib/bundler/lockfile_generator.rb +95 -0
  79. data/lib/bundler/lockfile_parser.rb +50 -37
  80. data/lib/bundler/match_platform.rb +13 -3
  81. data/lib/bundler/mirror.rb +10 -5
  82. data/lib/bundler/plugin.rb +22 -8
  83. data/lib/bundler/plugin/api.rb +2 -1
  84. data/lib/bundler/plugin/api/source.rb +17 -4
  85. data/lib/bundler/plugin/events.rb +61 -0
  86. data/lib/bundler/plugin/index.rb +9 -2
  87. data/lib/bundler/plugin/installer.rb +7 -6
  88. data/lib/bundler/plugin/source_list.rb +7 -8
  89. data/lib/bundler/process_lock.rb +24 -0
  90. data/lib/bundler/psyched_yaml.rb +10 -0
  91. data/lib/bundler/remote_specification.rb +30 -1
  92. data/lib/bundler/resolver.rb +187 -194
  93. data/lib/bundler/resolver/spec_group.rb +106 -0
  94. data/lib/bundler/retry.rb +5 -1
  95. data/lib/bundler/ruby_dsl.rb +1 -0
  96. data/lib/bundler/ruby_version.rb +12 -2
  97. data/lib/bundler/rubygems_ext.rb +23 -8
  98. data/lib/bundler/rubygems_gem_installer.rb +90 -0
  99. data/lib/bundler/rubygems_integration.rb +193 -70
  100. data/lib/bundler/runtime.rb +39 -22
  101. data/lib/bundler/settings.rb +245 -85
  102. data/lib/bundler/settings/validator.rb +102 -0
  103. data/lib/bundler/setup.rb +4 -7
  104. data/lib/bundler/shared_helpers.rb +183 -40
  105. data/lib/bundler/similarity_detector.rb +1 -0
  106. data/lib/bundler/source.rb +58 -1
  107. data/lib/bundler/source/gemspec.rb +1 -0
  108. data/lib/bundler/source/git.rb +52 -23
  109. data/lib/bundler/source/git/git_proxy.rb +30 -14
  110. data/lib/bundler/source/metadata.rb +62 -0
  111. data/lib/bundler/source/path.rb +42 -16
  112. data/lib/bundler/source/path/installer.rb +4 -2
  113. data/lib/bundler/source/rubygems.rb +171 -82
  114. data/lib/bundler/source/rubygems/remote.rb +12 -2
  115. data/lib/bundler/source_list.rb +75 -15
  116. data/lib/bundler/spec_set.rb +67 -32
  117. data/lib/bundler/ssl_certs/certificate_manager.rb +2 -1
  118. data/lib/bundler/stub_specification.rb +86 -2
  119. data/lib/bundler/templates/.document +1 -0
  120. data/lib/bundler/templates/Executable +13 -1
  121. data/lib/bundler/templates/Executable.bundler +105 -0
  122. data/lib/bundler/templates/Executable.standalone +5 -5
  123. data/lib/bundler/templates/Gemfile +3 -0
  124. data/lib/bundler/templates/gems.rb +8 -0
  125. data/lib/bundler/templates/newgem/Gemfile.tt +4 -2
  126. data/lib/bundler/templates/newgem/LICENSE.txt.tt +1 -1
  127. data/lib/bundler/templates/newgem/README.md.tt +14 -8
  128. data/lib/bundler/templates/newgem/Rakefile.tt +5 -5
  129. data/lib/bundler/templates/newgem/bin/console.tt +1 -1
  130. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +4 -4
  131. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +3 -3
  132. data/lib/bundler/templates/newgem/gitignore.tt +5 -1
  133. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +7 -6
  134. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +4 -4
  135. data/lib/bundler/templates/newgem/newgem.gemspec.tt +21 -12
  136. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  137. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +1 -3
  138. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +13 -1
  139. data/lib/bundler/templates/newgem/test/newgem_test.rb.tt +1 -1
  140. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +3 -3
  141. data/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
  142. data/lib/bundler/ui.rb +1 -0
  143. data/lib/bundler/ui/rg_proxy.rb +1 -0
  144. data/lib/bundler/ui/shell.rb +30 -10
  145. data/lib/bundler/ui/silent.rb +21 -1
  146. data/lib/bundler/uri_credentials_filter.rb +1 -0
  147. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  148. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
  149. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  150. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  151. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  152. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +26 -6
  153. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +2 -1
  154. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +12 -4
  155. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +3 -2
  156. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  157. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +11 -3
  158. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +13 -1
  159. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +3 -2
  160. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +3 -2
  161. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +18 -5
  162. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +75 -7
  163. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  164. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  165. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
  166. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +499 -128
  167. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
  169. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/faster.rb +1 -0
  170. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent.rb +27 -24
  171. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent/ssl_reuse.rb +2 -1
  172. data/lib/bundler/vendor/thor/lib/thor.rb +46 -21
  173. data/lib/bundler/vendor/thor/lib/thor/actions.rb +24 -22
  174. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +2 -1
  175. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  176. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +2 -2
  177. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +16 -8
  178. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +66 -18
  179. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +17 -15
  180. data/lib/bundler/vendor/thor/lib/thor/base.rb +55 -32
  181. data/lib/bundler/vendor/thor/lib/thor/command.rb +13 -11
  182. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -1
  183. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +7 -5
  184. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +94 -63
  185. data/lib/bundler/vendor/thor/lib/thor/error.rb +3 -3
  186. data/lib/bundler/vendor/thor/lib/thor/group.rb +13 -13
  187. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +4 -5
  188. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
  189. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +4 -7
  190. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +16 -16
  191. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +42 -21
  192. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +13 -10
  193. data/lib/bundler/vendor/thor/lib/thor/runner.rb +31 -29
  194. data/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  195. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +49 -33
  196. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -1
  197. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +4 -4
  198. data/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  199. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  200. data/lib/bundler/vendored_fileutils.rb +9 -0
  201. data/lib/bundler/vendored_molinillo.rb +1 -0
  202. data/lib/bundler/vendored_persistent.rb +43 -3
  203. data/lib/bundler/vendored_thor.rb +6 -2
  204. data/lib/bundler/version.rb +19 -2
  205. data/lib/bundler/version_ranges.rb +76 -0
  206. data/lib/bundler/vlad.rb +5 -0
  207. data/lib/bundler/worker.rb +30 -6
  208. data/lib/bundler/yaml_serializer.rb +4 -4
  209. data/man/bundle-add.1 +58 -0
  210. data/man/bundle-add.1.txt +52 -0
  211. data/man/bundle-add.ronn +40 -0
  212. data/{lib/bundler/man/bundle-binstubs → man/bundle-binstubs.1} +11 -1
  213. data/man/bundle-binstubs.1.txt +48 -0
  214. data/man/bundle-binstubs.ronn +15 -1
  215. data/man/bundle-check.1 +31 -0
  216. data/man/bundle-check.1.txt +33 -0
  217. data/man/bundle-check.ronn +26 -0
  218. data/man/bundle-clean.1 +24 -0
  219. data/man/bundle-clean.1.txt +26 -0
  220. data/man/bundle-clean.ronn +18 -0
  221. data/man/bundle-config.1 +497 -0
  222. data/man/bundle-config.1.txt +529 -0
  223. data/man/bundle-config.ronn +233 -61
  224. data/man/bundle-doctor.1 +44 -0
  225. data/man/bundle-doctor.1.txt +44 -0
  226. data/man/bundle-doctor.ronn +33 -0
  227. data/{lib/bundler/man/bundle-exec → man/bundle-exec.1} +6 -3
  228. data/man/bundle-exec.1.txt +178 -0
  229. data/man/bundle-exec.ronn +10 -3
  230. data/{lib/bundler/man/bundle-gem → man/bundle-gem.1} +4 -4
  231. data/man/bundle-gem.1.txt +91 -0
  232. data/man/bundle-gem.ronn +3 -2
  233. data/man/bundle-info.1 +20 -0
  234. data/man/bundle-info.1.txt +21 -0
  235. data/man/bundle-info.ronn +17 -0
  236. data/man/bundle-init.1 +25 -0
  237. data/man/bundle-init.1.txt +34 -0
  238. data/man/bundle-init.ronn +29 -0
  239. data/man/bundle-inject.1 +33 -0
  240. data/man/bundle-inject.1.txt +32 -0
  241. data/man/bundle-inject.ronn +22 -0
  242. data/{lib/bundler/man/bundle-install → man/bundle-install.1} +32 -29
  243. data/man/bundle-install.1.txt +396 -0
  244. data/man/bundle-install.ronn +45 -36
  245. data/man/bundle-list.1 +50 -0
  246. data/man/bundle-list.1.txt +43 -0
  247. data/man/bundle-list.ronn +33 -0
  248. data/{lib/bundler/man/bundle-lock → man/bundle-lock.1} +43 -2
  249. data/man/bundle-lock.1.txt +93 -0
  250. data/man/bundle-lock.ronn +47 -0
  251. data/man/bundle-open.1 +32 -0
  252. data/man/bundle-open.1.txt +29 -0
  253. data/man/bundle-open.ronn +19 -0
  254. data/man/bundle-outdated.1 +155 -0
  255. data/man/bundle-outdated.1.txt +131 -0
  256. data/man/bundle-outdated.ronn +111 -0
  257. data/{lib/bundler/man/bundle-package → man/bundle-package.1} +6 -3
  258. data/man/bundle-package.1.txt +79 -0
  259. data/man/bundle-package.ronn +7 -2
  260. data/{lib/bundler/man/bundle-platform → man/bundle-platform.1} +1 -1
  261. data/man/bundle-platform.1.txt +57 -0
  262. data/man/bundle-pristine.1 +34 -0
  263. data/man/bundle-pristine.1.txt +44 -0
  264. data/man/bundle-pristine.ronn +34 -0
  265. data/man/bundle-remove.1 +31 -0
  266. data/man/bundle-remove.1.txt +34 -0
  267. data/man/bundle-remove.ronn +23 -0
  268. data/man/bundle-show.1 +23 -0
  269. data/man/bundle-show.1.txt +27 -0
  270. data/man/bundle-show.ronn +21 -0
  271. data/man/bundle-update.1 +394 -0
  272. data/man/bundle-update.1.txt +391 -0
  273. data/man/bundle-update.ronn +172 -16
  274. data/man/bundle-viz.1 +39 -0
  275. data/man/bundle-viz.1.txt +39 -0
  276. data/man/bundle-viz.ronn +30 -0
  277. data/{lib/bundler/man/bundle → man/bundle.1} +44 -28
  278. data/man/bundle.1.txt +116 -0
  279. data/man/bundle.ronn +39 -27
  280. data/{lib/bundler/man → man}/gemfile.5 +67 -84
  281. data/man/gemfile.5.ronn +77 -55
  282. data/man/gemfile.5.txt +653 -0
  283. data/man/index.txt +25 -8
  284. metadata +118 -58
  285. data/.codeclimate.yml +0 -25
  286. data/.gitignore +0 -16
  287. data/.rspec +0 -3
  288. data/.rubocop.yml +0 -128
  289. data/.rubocop_todo.yml +0 -248
  290. data/.travis.yml +0 -108
  291. data/CODE_OF_CONDUCT.md +0 -42
  292. data/CONTRIBUTING.md +0 -36
  293. data/DEVELOPMENT.md +0 -148
  294. data/ISSUES.md +0 -100
  295. data/Rakefile +0 -333
  296. data/bin/rake +0 -19
  297. data/bin/rspec +0 -15
  298. data/bin/rubocop +0 -17
  299. data/bin/with_rubygems +0 -39
  300. data/lib/bundler/man/bundle-binstubs.txt +0 -33
  301. data/lib/bundler/man/bundle-config +0 -254
  302. data/lib/bundler/man/bundle-config.txt +0 -282
  303. data/lib/bundler/man/bundle-exec.txt +0 -171
  304. data/lib/bundler/man/bundle-gem.txt +0 -90
  305. data/lib/bundler/man/bundle-install.txt +0 -385
  306. data/lib/bundler/man/bundle-lock.txt +0 -52
  307. data/lib/bundler/man/bundle-package.txt +0 -74
  308. data/lib/bundler/man/bundle-platform.txt +0 -57
  309. data/lib/bundler/man/bundle-update +0 -221
  310. data/lib/bundler/man/bundle-update.txt +0 -227
  311. data/lib/bundler/man/bundle.txt +0 -104
  312. data/lib/bundler/man/gemfile.5.txt +0 -636
  313. data/lib/bundler/postit_trampoline.rb +0 -68
  314. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client.rb +0 -79
  315. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/cache.rb +0 -112
  316. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/updater.rb +0 -80
  317. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/version.rb +0 -4
  318. data/lib/bundler/vendor/postit/lib/postit.rb +0 -15
  319. data/lib/bundler/vendor/postit/lib/postit/environment.rb +0 -44
  320. data/lib/bundler/vendor/postit/lib/postit/installer.rb +0 -28
  321. data/lib/bundler/vendor/postit/lib/postit/parser.rb +0 -21
  322. data/lib/bundler/vendor/postit/lib/postit/setup.rb +0 -12
  323. data/lib/bundler/vendor/postit/lib/postit/version.rb +0 -3
@@ -23,6 +23,8 @@ class Bundler::Thor
23
23
  if echo?
24
24
  $stdin.gets
25
25
  else
26
+ # Lazy-load io/console since it is gem-ified as of 2.3
27
+ require "io/console" if RUBY_VERSION > "1.9.2"
26
28
  $stdin.noecho(&:gets)
27
29
  end
28
30
  end
@@ -10,8 +10,8 @@ class Bundler::Thor
10
10
 
11
11
  type = options[:type]
12
12
 
13
- fail ArgumentError, "#{class_name} name can't be nil." if name.nil?
14
- fail ArgumentError, "Type :#{type} is not valid for #{class_name.downcase}s." if type && !valid_type?(type)
13
+ raise ArgumentError, "#{class_name} name can't be nil." if name.nil?
14
+ raise ArgumentError, "Type :#{type} is not valid for #{class_name.downcase}s." if type && !valid_type?(type)
15
15
 
16
16
  @name = name.to_s
17
17
  @description = options[:desc]
@@ -44,11 +44,8 @@ class Bundler::Thor
44
44
  protected
45
45
 
46
46
  def validate!
47
- if required? && !default.nil?
48
- fail ArgumentError, "An argument cannot be required and have default value."
49
- elsif @enum && !@enum.is_a?(Array)
50
- fail ArgumentError, "An argument cannot have an enum other than an array."
51
- end
47
+ raise ArgumentError, "An argument cannot be required and have default value." if required? && !default.nil?
48
+ raise ArgumentError, "An argument cannot have an enum other than an array." if @enum && !@enum.is_a?(Array)
52
49
  end
53
50
 
54
51
  def valid_type?(type)
@@ -1,6 +1,6 @@
1
1
  class Bundler::Thor
2
2
  class Arguments #:nodoc: # rubocop:disable ClassLength
3
- NUMERIC = /(\d*\.\d+|\d+)/
3
+ NUMERIC = /[-+]?(\d*\.\d+|\d+)/
4
4
 
5
5
  # Receives an array of args and returns two arrays, one with arguments
6
6
  # and one with switches.
@@ -24,7 +24,8 @@ class Bundler::Thor
24
24
  # Takes an array of Bundler::Thor::Argument objects.
25
25
  #
26
26
  def initialize(arguments = [])
27
- @assigns, @non_assigned_required = {}, []
27
+ @assigns = {}
28
+ @non_assigned_required = []
28
29
  @switches = arguments
29
30
 
30
31
  arguments.each do |argument|
@@ -49,7 +50,7 @@ class Bundler::Thor
49
50
  @assigns
50
51
  end
51
52
 
52
- def remaining # rubocop:disable TrivialAccessors
53
+ def remaining
53
54
  @pile
54
55
  end
55
56
 
@@ -73,7 +74,7 @@ class Bundler::Thor
73
74
  end
74
75
 
75
76
  def unshift(arg)
76
- if arg.kind_of?(Array)
77
+ if arg.is_a?(Array)
77
78
  @pile = arg + @pile
78
79
  else
79
80
  @pile.unshift(arg)
@@ -99,6 +100,7 @@ class Bundler::Thor
99
100
 
100
101
  while current_is_value? && peek.include?(":")
101
102
  key, value = shift.split(":", 2)
103
+ raise MalformattedArgumentError, "You can't specify '#{key}' more than once in option '#{name}'; got #{key}:#{hash[key]} and #{key}:#{value}" if hash.include? key
102
104
  hash[key] = value
103
105
  end
104
106
  hash
@@ -128,13 +130,13 @@ class Bundler::Thor
128
130
  return shift if peek.is_a?(Numeric)
129
131
 
130
132
  unless peek =~ NUMERIC && $& == peek
131
- fail MalformattedArgumentError, "Expected numeric value for '#{name}'; got #{peek.inspect}"
133
+ raise MalformattedArgumentError, "Expected numeric value for '#{name}'; got #{peek.inspect}"
132
134
  end
133
135
 
134
136
  value = $&.index(".") ? shift.to_f : shift.to_i
135
137
  if @switches.is_a?(Hash) && switch = @switches[name]
136
138
  if switch.enum && !switch.enum.include?(value)
137
- fail MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
139
+ raise MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
138
140
  end
139
141
  end
140
142
  value
@@ -150,9 +152,9 @@ class Bundler::Thor
150
152
  nil
151
153
  else
152
154
  value = shift
153
- if @switches.is_a?(Hash) && switch = @switches[name] # rubocop:disable AssignmentInCondition
155
+ if @switches.is_a?(Hash) && switch = @switches[name]
154
156
  if switch.enum && !switch.enum.include?(value)
155
- fail MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
157
+ raise MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
156
158
  end
157
159
  end
158
160
  value
@@ -162,14 +164,12 @@ class Bundler::Thor
162
164
  # Raises an error if @non_assigned_required array is not empty.
163
165
  #
164
166
  def check_requirement!
165
- unless @non_assigned_required.empty?
166
- names = @non_assigned_required.map do |o|
167
- o.respond_to?(:switch_name) ? o.switch_name : o.human_name
168
- end.join("', '")
169
-
170
- class_name = self.class.name.split("::").last.downcase
171
- fail RequiredArgumentMissingError, "No value provided for required #{class_name} '#{names}'"
172
- end
167
+ return if @non_assigned_required.empty?
168
+ names = @non_assigned_required.map do |o|
169
+ o.respond_to?(:switch_name) ? o.switch_name : o.human_name
170
+ end.join("', '")
171
+ class_name = self.class.name.split("::").last.downcase
172
+ raise RequiredArgumentMissingError, "No value provided for required #{class_name} '#{names}'"
173
173
  end
174
174
  end
175
175
  end
@@ -5,6 +5,7 @@ class Bundler::Thor
5
5
  VALID_TYPES = [:boolean, :numeric, :hash, :array, :string]
6
6
 
7
7
  def initialize(name, options = {})
8
+ @check_default_type = options[:check_default_type]
8
9
  options[:required] = false unless options.key?(:required)
9
10
  super
10
11
  @lazy_default = options[:lazy_default]
@@ -40,31 +41,33 @@ class Bundler::Thor
40
41
  #
41
42
  # By default all options are optional, unless :required is given.
42
43
  #
43
- def self.parse(key, value) # rubocop:disable MethodLength
44
+ def self.parse(key, value)
44
45
  if key.is_a?(Array)
45
46
  name, *aliases = key
46
47
  else
47
- name, aliases = key, []
48
+ name = key
49
+ aliases = []
48
50
  end
49
51
 
50
52
  name = name.to_s
51
53
  default = value
52
54
 
53
55
  type = case value
54
- when Symbol
55
- default = nil
56
- if VALID_TYPES.include?(value)
57
- value
58
- elsif required = (value == :required) # rubocop:disable AssignmentInCondition
59
- :string
60
- end
61
- when TrueClass, FalseClass
62
- :boolean
63
- when Numeric
64
- :numeric
65
- when Hash, Array, String
66
- value.class.name.downcase.to_sym
67
- end
56
+ when Symbol
57
+ default = nil
58
+ if VALID_TYPES.include?(value)
59
+ value
60
+ elsif required = (value == :required) # rubocop:disable AssignmentInCondition
61
+ :string
62
+ end
63
+ when TrueClass, FalseClass
64
+ :boolean
65
+ when Numeric
66
+ :numeric
67
+ when Hash, Array, String
68
+ value.class.name.downcase.to_sym
69
+ end
70
+
68
71
  new(name.to_s, :required => required, :type => type, :default => default, :aliases => aliases)
69
72
  end
70
73
 
@@ -78,15 +81,15 @@ class Bundler::Thor
78
81
 
79
82
  def usage(padding = 0)
80
83
  sample = if banner && !banner.to_s.empty?
81
- "#{switch_name}=#{banner}"
84
+ "#{switch_name}=#{banner}".dup
82
85
  else
83
86
  switch_name
84
87
  end
85
88
 
86
- sample = "[#{sample}]" unless required?
89
+ sample = "[#{sample}]".dup unless required?
87
90
 
88
91
  if boolean?
89
- sample << ", [#{dasherize("no-" + human_name)}]" unless name == "force"
92
+ sample << ", [#{dasherize('no-' + human_name)}]" unless (name == "force") || name.start_with?("no-")
90
93
  end
91
94
 
92
95
  if aliases.empty?
@@ -107,7 +110,25 @@ class Bundler::Thor
107
110
  protected
108
111
 
109
112
  def validate!
110
- fail ArgumentError, "An option cannot be boolean and required." if boolean? && required?
113
+ raise ArgumentError, "An option cannot be boolean and required." if boolean? && required?
114
+ validate_default_type! if @check_default_type
115
+ end
116
+
117
+ def validate_default_type!
118
+ default_type = case @default
119
+ when nil
120
+ return
121
+ when TrueClass, FalseClass
122
+ required? ? :string : :boolean
123
+ when Numeric
124
+ :numeric
125
+ when Symbol
126
+ :string
127
+ when Hash, Array, String
128
+ @default.class.name.downcase.to_sym
129
+ end
130
+
131
+ raise ArgumentError, "Expected #{@type} default value for '#{switch_name}'; got #{@default.inspect} (#{default_type})" unless default_type == @type
111
132
  end
112
133
 
113
134
  def dasherized?
@@ -119,7 +140,7 @@ class Bundler::Thor
119
140
  end
120
141
 
121
142
  def dasherize(str)
122
- (str.length > 1 ? "--" : "-") + str.gsub("_", "-")
143
+ (str.length > 1 ? "--" : "-") + str.tr("_", "-")
123
144
  end
124
145
  end
125
146
  end
@@ -14,23 +14,24 @@ class Bundler::Thor
14
14
  when true
15
15
  "--#{key}"
16
16
  when Array
17
- "--#{key} #{value.map { |v| v.inspect }.join(' ')}"
17
+ "--#{key} #{value.map(&:inspect).join(' ')}"
18
18
  when Hash
19
19
  "--#{key} #{value.map { |k, v| "#{k}:#{v}" }.join(' ')}"
20
20
  when nil, false
21
- ""
21
+ nil
22
22
  else
23
23
  "--#{key} #{value.inspect}"
24
24
  end
25
- end.join(" ")
25
+ end.compact.join(" ")
26
26
  end
27
27
 
28
28
  # Takes a hash of Bundler::Thor::Option and a hash with defaults.
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)
32
+ def initialize(hash_options = {}, defaults = {}, stop_on_unknown = false, disable_required_check = false)
33
33
  @stop_on_unknown = stop_on_unknown
34
+ @disable_required_check = disable_required_check
34
35
  options = hash_options.values
35
36
  super(options)
36
37
 
@@ -40,7 +41,9 @@ class Bundler::Thor
40
41
  @non_assigned_required.delete(hash_options[key])
41
42
  end
42
43
 
43
- @shorts, @switches, @extra = {}, {}, []
44
+ @shorts = {}
45
+ @switches = {}
46
+ @extra = []
44
47
 
45
48
  options.each do |option|
46
49
  @switches[option.switch_name] = option
@@ -52,7 +55,7 @@ class Bundler::Thor
52
55
  end
53
56
  end
54
57
 
55
- def remaining # rubocop:disable TrivialAccessors
58
+ def remaining
56
59
  @extra
57
60
  end
58
61
 
@@ -109,7 +112,7 @@ class Bundler::Thor
109
112
  end
110
113
  end
111
114
 
112
- check_requirement!
115
+ check_requirement! unless @disable_required_check
113
116
 
114
117
  assigns = Bundler::Thor::CoreExt::HashWithIndifferentAccess.new(@assigns)
115
118
  assigns.freeze
@@ -119,7 +122,7 @@ class Bundler::Thor
119
122
  def check_unknown!
120
123
  # an unknown option starts with - or -- and has no more --'s afterward.
121
124
  unknown = @extra.select { |str| str =~ /^--?(?:(?!--).)*$/ }
122
- fail UnknownArgumentError, "Unknown switches '#{unknown.join(', ')}'" unless unknown.empty?
125
+ raise UnknownArgumentError, "Unknown switches '#{unknown.join(', ')}'" unless unknown.empty?
123
126
  end
124
127
 
125
128
  protected
@@ -186,7 +189,7 @@ class Bundler::Thor
186
189
  shift
187
190
  false
188
191
  else
189
- true
192
+ !no_or_skip?(switch)
190
193
  end
191
194
  else
192
195
  @switches.key?(switch) || !no_or_skip?(switch)
@@ -207,7 +210,7 @@ class Bundler::Thor
207
210
  elsif option.lazy_default
208
211
  return option.lazy_default
209
212
  else
210
- fail MalformattedArgumentError, "No value provided for option '#{switch}'"
213
+ raise MalformattedArgumentError, "No value provided for option '#{switch}'"
211
214
  end
212
215
  end
213
216
 
@@ -2,19 +2,25 @@ require "bundler/vendor/thor/lib/thor"
2
2
  require "bundler/vendor/thor/lib/thor/group"
3
3
  require "bundler/vendor/thor/lib/thor/core_ext/io_binary_read"
4
4
 
5
- require "fileutils"
6
- require "open-uri"
7
5
  require "yaml"
8
- require "digest/md5"
6
+ require "digest"
9
7
  require "pathname"
10
8
 
11
9
  class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLength
12
10
  map "-T" => :list, "-i" => :install, "-u" => :update, "-v" => :version
13
11
 
12
+ def self.banner(command, all = false, subcommand = false)
13
+ "thor " + command.formatted_usage(self, all, subcommand)
14
+ end
15
+
16
+ def self.exit_on_failure?
17
+ true
18
+ end
19
+
14
20
  # Override Bundler::Thor#help so it can give information about any class and any method.
15
21
  #
16
22
  def help(meth = nil)
17
- if meth && !self.respond_to?(meth)
23
+ if meth && !respond_to?(meth)
18
24
  initialize_thorfiles(meth)
19
25
  klass, command = Bundler::Thor::Util.find_class_and_command_by_namespace(meth)
20
26
  self.class.handle_no_command_error(command, false) if klass.nil?
@@ -45,16 +51,18 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
45
51
  # command in said directory.
46
52
  begin
47
53
  if File.directory?(File.expand_path(name))
48
- base, package = File.join(name, "main.thor"), :directory
49
- contents = open(base) { |input| input.read }
54
+ base = File.join(name, "main.thor")
55
+ package = :directory
56
+ contents = open(base, &:read)
50
57
  else
51
- base, package = name, :file
52
- contents = open(name) { |input| input.read }
58
+ base = name
59
+ package = :file
60
+ contents = open(name, &:read)
53
61
  end
54
62
  rescue OpenURI::HTTPError
55
63
  raise Error, "Error opening URI '#{name}'"
56
64
  rescue Errno::ENOENT
57
- fail Error, "Error opening file '#{name}'"
65
+ raise Error, "Error opening file '#{name}'"
58
66
  end
59
67
 
60
68
  say "Your Bundler::Thorfile contains:"
@@ -82,7 +90,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
82
90
  end
83
91
 
84
92
  thor_yaml[as] = {
85
- :filename => Digest::MD5.hexdigest(name + as),
93
+ :filename => Digest(:MD5).hexdigest(name + as),
86
94
  :location => location,
87
95
  :namespaces => Bundler::Thor::Util.namespaces_in_content(contents, base)
88
96
  }
@@ -94,6 +102,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
94
102
  if package == :file
95
103
  File.open(destination, "w") { |f| f.puts contents }
96
104
  else
105
+ require "fileutils"
97
106
  FileUtils.cp_r(name, destination)
98
107
  end
99
108
 
@@ -108,9 +117,10 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
108
117
 
109
118
  desc "uninstall NAME", "Uninstall a named Bundler::Thor module"
110
119
  def uninstall(name)
111
- fail Error, "Can't find module '#{name}'" unless thor_yaml[name]
120
+ raise Error, "Can't find module '#{name}'" unless thor_yaml[name]
112
121
  say "Uninstalling #{name}."
113
- FileUtils.rm_rf(File.join(thor_root, "#{thor_yaml[name][:filename]}"))
122
+ require "fileutils"
123
+ FileUtils.rm_rf(File.join(thor_root, (thor_yaml[name][:filename]).to_s))
114
124
 
115
125
  thor_yaml.delete(name)
116
126
  save_yaml(thor_yaml)
@@ -120,7 +130,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
120
130
 
121
131
  desc "update NAME", "Update a Bundler::Thor file from its original location"
122
132
  def update(name)
123
- fail Error, "Can't find module '#{name}'" if !thor_yaml[name] || !thor_yaml[name][:location]
133
+ raise Error, "Can't find module '#{name}'" if !thor_yaml[name] || !thor_yaml[name][:location]
124
134
 
125
135
  say "Updating '#{name}' from #{thor_yaml[name][:location]}"
126
136
 
@@ -128,6 +138,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
128
138
  self.options = options.merge("as" => name)
129
139
 
130
140
  if File.directory? File.expand_path(name)
141
+ require "fileutils"
131
142
  FileUtils.rm_rf(File.join(thor_root, old_filename))
132
143
 
133
144
  thor_yaml.delete(old_filename)
@@ -138,9 +149,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
138
149
  filename = install(thor_yaml[name][:location])
139
150
  end
140
151
 
141
- unless filename == old_filename
142
- File.delete(File.join(thor_root, old_filename))
143
- end
152
+ File.delete(File.join(thor_root, old_filename)) unless filename == old_filename
144
153
  end
145
154
 
146
155
  desc "installed", "List the installed Bundler::Thor modules and commands"
@@ -168,10 +177,6 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
168
177
 
169
178
  private
170
179
 
171
- def self.banner(command, all = false, subcommand = false)
172
- "thor " + command.formatted_usage(self, all, subcommand)
173
- end
174
-
175
180
  def thor_root
176
181
  Bundler::Thor::Util.thor_root
177
182
  end
@@ -190,6 +195,7 @@ private
190
195
  yaml_file = File.join(thor_root, "thor.yml")
191
196
 
192
197
  unless File.exist?(yaml_file)
198
+ require "fileutils"
193
199
  FileUtils.mkdir_p(thor_root)
194
200
  yaml_file = File.join(thor_root, "thor.yml")
195
201
  FileUtils.touch(yaml_file)
@@ -198,10 +204,6 @@ private
198
204
  File.open(yaml_file, "w") { |f| f.puts yaml.to_yaml }
199
205
  end
200
206
 
201
- def self.exit_on_failure?
202
- true
203
- end
204
-
205
207
  # Load the Bundler::Thorfiles. If relevant_to is supplied, looks for specific files
206
208
  # in the thor_root instead of loading them all.
207
209
  #
@@ -263,11 +265,11 @@ private
263
265
  def thorfiles_relevant_to(meth)
264
266
  lookup = [meth, meth.split(":")[0...-1].join(":")]
265
267
 
266
- files = thor_yaml.select do |k, v|
268
+ files = thor_yaml.select do |_, v|
267
269
  v[:namespaces] && !(v[:namespaces] & lookup).empty?
268
270
  end
269
271
 
270
- files.map { |k, v| File.join(thor_root, "#{v[:filename]}") }
272
+ files.map { |_, v| File.join(thor_root, (v[:filename]).to_s) }
271
273
  end
272
274
 
273
275
  # Display information about the given klasses. If with_module is given,
@@ -276,7 +278,7 @@ private
276
278
  def display_klasses(with_modules = false, show_internal = false, klasses = Bundler::Thor::Base.subclasses)
277
279
  klasses -= [Bundler::Thor, Bundler::Thor::Runner, Bundler::Thor::Group] unless show_internal
278
280
 
279
- fail Error, "No Bundler::Thor commands available" if klasses.empty?
281
+ raise Error, "No Bundler::Thor commands available" if klasses.empty?
280
282
  show_modules if with_modules && !thor_yaml.empty?
281
283
 
282
284
  list = Hash.new { |h, k| h[k] = [] }
@@ -306,8 +308,8 @@ private
306
308
  alias_method :display_tasks, :display_commands
307
309
 
308
310
  def show_modules #:nodoc:
309
- info = []
310
- labels = %w[Modules Namespaces]
311
+ info = []
312
+ labels = %w(Modules Namespaces)
311
313
 
312
314
  info << labels
313
315
  info << ["-" * labels[0].size, "-" * labels[1].size]