rubygems-update 3.7.2 → 4.0.0.beta1

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 (206) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1413 -1323
  3. data/CODE_OF_CONDUCT.md +7 -129
  4. data/Manifest.txt +5 -11
  5. data/README.md +2 -2
  6. data/bundler/CHANGELOG.md +990 -917
  7. data/bundler/README.md +4 -4
  8. data/bundler/bundler.gemspec +3 -3
  9. data/bundler/lib/bundler/build_metadata.rb +2 -2
  10. data/bundler/lib/bundler/capistrano.rb +1 -19
  11. data/bundler/lib/bundler/cli/cache.rb +1 -11
  12. data/bundler/lib/bundler/cli/common.rb +20 -3
  13. data/bundler/lib/bundler/cli/config.rb +1 -2
  14. data/bundler/lib/bundler/cli/console.rb +5 -0
  15. data/bundler/lib/bundler/cli/exec.rb +29 -4
  16. data/bundler/lib/bundler/cli/gem.rb +19 -33
  17. data/bundler/lib/bundler/cli/install.rb +7 -82
  18. data/bundler/lib/bundler/cli/issue.rb +2 -2
  19. data/bundler/lib/bundler/cli/list.rb +33 -2
  20. data/bundler/lib/bundler/cli/plugin.rb +5 -1
  21. data/bundler/lib/bundler/cli/show.rb +1 -1
  22. data/bundler/lib/bundler/cli/update.rb +3 -3
  23. data/bundler/lib/bundler/cli.rb +75 -83
  24. data/bundler/lib/bundler/compact_index_client.rb +0 -1
  25. data/bundler/lib/bundler/current_ruby.rb +3 -15
  26. data/bundler/lib/bundler/definition.rb +45 -35
  27. data/bundler/lib/bundler/deployment.rb +1 -64
  28. data/bundler/lib/bundler/digest.rb +1 -1
  29. data/bundler/lib/bundler/dsl.rb +13 -35
  30. data/bundler/lib/bundler/endpoint_specification.rb +0 -22
  31. data/bundler/lib/bundler/errors.rb +1 -5
  32. data/bundler/lib/bundler/feature_flag.rb +0 -33
  33. data/bundler/lib/bundler/fetcher/compact_index.rb +1 -1
  34. data/bundler/lib/bundler/friendly_errors.rb +2 -2
  35. data/bundler/lib/bundler/index.rb +0 -7
  36. data/bundler/lib/bundler/inline.rb +1 -1
  37. data/bundler/lib/bundler/installer/gem_installer.rb +0 -11
  38. data/bundler/lib/bundler/installer.rb +0 -6
  39. data/bundler/lib/bundler/lockfile_generator.rb +1 -1
  40. data/bundler/lib/bundler/lockfile_parser.rb +2 -12
  41. data/bundler/lib/bundler/man/bundle-add.1 +1 -1
  42. data/bundler/lib/bundler/man/bundle-binstubs.1 +3 -6
  43. data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +4 -6
  44. data/bundler/lib/bundler/man/bundle-cache.1 +2 -14
  45. data/bundler/lib/bundler/man/bundle-cache.1.ronn +1 -14
  46. data/bundler/lib/bundler/man/bundle-check.1 +2 -5
  47. data/bundler/lib/bundler/man/bundle-check.1.ronn +0 -5
  48. data/bundler/lib/bundler/man/bundle-clean.1 +1 -1
  49. data/bundler/lib/bundler/man/bundle-config.1 +6 -33
  50. data/bundler/lib/bundler/man/bundle-config.1.ronn +20 -55
  51. data/bundler/lib/bundler/man/bundle-console.1 +1 -1
  52. data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
  53. data/bundler/lib/bundler/man/bundle-env.1 +1 -1
  54. data/bundler/lib/bundler/man/bundle-exec.1 +2 -5
  55. data/bundler/lib/bundler/man/bundle-exec.1.ronn +1 -5
  56. data/bundler/lib/bundler/man/bundle-fund.1 +1 -1
  57. data/bundler/lib/bundler/man/bundle-gem.1 +3 -6
  58. data/bundler/lib/bundler/man/bundle-gem.1.ronn +2 -5
  59. data/bundler/lib/bundler/man/bundle-help.1 +1 -1
  60. data/bundler/lib/bundler/man/bundle-info.1 +1 -1
  61. data/bundler/lib/bundler/man/bundle-init.1 +1 -1
  62. data/bundler/lib/bundler/man/bundle-install.1 +8 -59
  63. data/bundler/lib/bundler/man/bundle-install.1.ronn +12 -107
  64. data/bundler/lib/bundler/man/bundle-issue.1 +1 -1
  65. data/bundler/lib/bundler/man/bundle-licenses.1 +1 -1
  66. data/bundler/lib/bundler/man/bundle-list.1 +6 -1
  67. data/bundler/lib/bundler/man/bundle-list.1.ronn +5 -0
  68. data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
  69. data/bundler/lib/bundler/man/bundle-open.1 +1 -1
  70. data/bundler/lib/bundler/man/bundle-outdated.1 +1 -1
  71. data/bundler/lib/bundler/man/bundle-platform.1 +1 -1
  72. data/bundler/lib/bundler/man/bundle-plugin.1 +2 -9
  73. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +0 -8
  74. data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
  75. data/bundler/lib/bundler/man/bundle-remove.1 +2 -8
  76. data/bundler/lib/bundler/man/bundle-remove.1.ronn +1 -8
  77. data/bundler/lib/bundler/man/bundle-show.1 +2 -5
  78. data/bundler/lib/bundler/man/bundle-show.1.ronn +0 -4
  79. data/bundler/lib/bundler/man/bundle-update.1 +1 -1
  80. data/bundler/lib/bundler/man/bundle-version.1 +1 -1
  81. data/bundler/lib/bundler/man/bundle.1 +1 -10
  82. data/bundler/lib/bundler/man/bundle.1.ronn +0 -9
  83. data/bundler/lib/bundler/man/gemfile.5 +1 -1
  84. data/bundler/lib/bundler/man/index.txt +0 -2
  85. data/bundler/lib/bundler/materialization.rb +1 -1
  86. data/bundler/lib/bundler/plugin/installer.rb +0 -10
  87. data/bundler/lib/bundler/plugin/source_list.rb +1 -1
  88. data/bundler/lib/bundler/plugin.rb +1 -1
  89. data/bundler/lib/bundler/resolver.rb +1 -1
  90. data/bundler/lib/bundler/ruby_dsl.rb +2 -0
  91. data/bundler/lib/bundler/ruby_version.rb +1 -3
  92. data/bundler/lib/bundler/rubygems_ext.rb +1 -1
  93. data/bundler/lib/bundler/rubygems_gem_installer.rb +1 -1
  94. data/bundler/lib/bundler/rubygems_integration.rb +1 -5
  95. data/bundler/lib/bundler/self_manager.rb +1 -1
  96. data/bundler/lib/bundler/settings.rb +7 -26
  97. data/bundler/lib/bundler/shared_helpers.rb +8 -20
  98. data/bundler/lib/bundler/source/git/git_proxy.rb +3 -11
  99. data/bundler/lib/bundler/source/git.rb +2 -3
  100. data/bundler/lib/bundler/source/path.rb +3 -7
  101. data/bundler/lib/bundler/source/rubygems.rb +11 -17
  102. data/bundler/lib/bundler/source.rb +1 -1
  103. data/bundler/lib/bundler/source_list.rb +4 -45
  104. data/bundler/lib/bundler/source_map.rb +2 -5
  105. data/bundler/lib/bundler/spec_set.rb +6 -15
  106. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +7 -129
  107. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  108. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
  109. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-go.rb.tt +11 -0
  110. data/bundler/lib/bundler/templates/newgem/ext/newgem/go.mod.tt +5 -0
  111. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem-go.c.tt +2 -0
  112. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.go.tt +31 -0
  113. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +6 -0
  114. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  115. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +4 -1
  116. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +26 -23
  117. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  118. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +50 -6
  119. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +57 -52
  120. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +5 -2
  121. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +1 -1
  122. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +57 -15
  123. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +1 -1
  124. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +34 -21
  125. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +12 -0
  126. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +9 -8
  127. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +2 -2
  128. data/bundler/lib/bundler/version.rb +1 -1
  129. data/bundler/lib/bundler/vlad.rb +1 -14
  130. data/bundler/lib/bundler.rb +6 -28
  131. data/doc/MAINTAINERS.txt +0 -7
  132. data/doc/bundler/UPGRADING.md +11 -5
  133. data/doc/rubygems/CONTRIBUTING.md +1 -1
  134. data/lib/rubygems/basic_specification.rb +3 -9
  135. data/lib/rubygems/bundler_version_finder.rb +1 -0
  136. data/lib/rubygems/command.rb +1 -1
  137. data/lib/rubygems/command_manager.rb +3 -4
  138. data/lib/rubygems/commands/build_command.rb +0 -7
  139. data/lib/rubygems/commands/cert_command.rb +1 -1
  140. data/lib/rubygems/commands/install_command.rb +1 -5
  141. data/lib/rubygems/commands/setup_command.rb +5 -3
  142. data/lib/rubygems/config_file.rb +1 -1
  143. data/lib/rubygems/dependency.rb +1 -1
  144. data/lib/rubygems/dependency_installer.rb +0 -77
  145. data/lib/rubygems/dependency_list.rb +1 -2
  146. data/lib/rubygems/deprecate.rb +74 -72
  147. data/lib/rubygems/doctor.rb +1 -1
  148. data/lib/rubygems/errors.rb +1 -1
  149. data/lib/rubygems/exceptions.rb +2 -3
  150. data/lib/rubygems/ext/builder.rb +6 -2
  151. data/lib/rubygems/ext/cargo_builder.rb +2 -2
  152. data/lib/rubygems/ext/cmake_builder.rb +97 -8
  153. data/lib/rubygems/ext/configure_builder.rb +2 -2
  154. data/lib/rubygems/ext/ext_conf_builder.rb +6 -2
  155. data/lib/rubygems/ext/rake_builder.rb +2 -2
  156. data/lib/rubygems/gem_runner.rb +0 -1
  157. data/lib/rubygems/install_update_options.rb +1 -2
  158. data/lib/rubygems/installer.rb +16 -54
  159. data/lib/rubygems/name_tuple.rb +7 -1
  160. data/lib/rubygems/package/tar_header.rb +4 -4
  161. data/lib/rubygems/package/tar_reader.rb +2 -0
  162. data/lib/rubygems/package/tar_writer.rb +1 -1
  163. data/lib/rubygems/package.rb +21 -12
  164. data/lib/rubygems/platform.rb +31 -11
  165. data/lib/rubygems/remote_fetcher.rb +8 -5
  166. data/lib/rubygems/resolver/conflict.rb +1 -1
  167. data/lib/rubygems/resolver.rb +1 -1
  168. data/lib/rubygems/security/signer.rb +1 -1
  169. data/lib/rubygems/source.rb +2 -2
  170. data/lib/rubygems/spec_fetcher.rb +4 -4
  171. data/lib/rubygems/specification.rb +5 -96
  172. data/lib/rubygems/specification_policy.rb +0 -36
  173. data/lib/rubygems/specification_record.rb +1 -1
  174. data/lib/rubygems/text.rb +1 -1
  175. data/lib/rubygems/uninstaller.rb +17 -6
  176. data/lib/rubygems/user_interaction.rb +6 -9
  177. data/lib/rubygems/util.rb +0 -22
  178. data/lib/rubygems/validator.rb +1 -1
  179. data/lib/rubygems/vendor/net-http/lib/net/http/generic_request.rb +25 -9
  180. data/lib/rubygems/vendor/net-http/lib/net/http/responses.rb +2 -2
  181. data/lib/rubygems/vendor/net-http/lib/net/http.rb +14 -14
  182. data/lib/rubygems/vendor/optparse/lib/optparse.rb +82 -41
  183. data/lib/rubygems/vendor/resolv/lib/resolv.rb +1 -1
  184. data/lib/rubygems/vendor/timeout/lib/timeout.rb +4 -1
  185. data/lib/rubygems/vendor/uri/lib/uri/common.rb +57 -15
  186. data/lib/rubygems/vendor/uri/lib/uri/file.rb +1 -1
  187. data/lib/rubygems/vendor/uri/lib/uri/generic.rb +34 -21
  188. data/lib/rubygems/vendor/uri/lib/uri/http.rb +12 -0
  189. data/lib/rubygems/vendor/uri/lib/uri/rfc2396_parser.rb +9 -8
  190. data/lib/rubygems/vendor/uri/lib/uri/version.rb +2 -2
  191. data/lib/rubygems/version.rb +2 -17
  192. data/lib/rubygems/win_platform.rb +31 -0
  193. data/lib/rubygems.rb +10 -38
  194. data/rubygems-update.gemspec +4 -4
  195. metadata +10 -18
  196. data/bundler/lib/bundler/cli/inject.rb +0 -60
  197. data/bundler/lib/bundler/cli/viz.rb +0 -31
  198. data/bundler/lib/bundler/graph.rb +0 -152
  199. data/bundler/lib/bundler/man/bundle-inject.1 +0 -31
  200. data/bundler/lib/bundler/man/bundle-inject.1.ronn +0 -32
  201. data/bundler/lib/bundler/man/bundle-viz.1 +0 -30
  202. data/bundler/lib/bundler/man/bundle-viz.1.ronn +0 -36
  203. data/bundler/lib/bundler/similarity_detector.rb +0 -63
  204. data/lib/rubygems/commands/query_command.rb +0 -43
  205. data/lib/rubygems/compatibility.rb +0 -41
  206. data/lib/rubygems/install_default_message.rb +0 -13
@@ -7,6 +7,7 @@
7
7
  #
8
8
  # See Gem::OptionParser for documentation.
9
9
  #
10
+ require 'set' unless defined?(Set)
10
11
 
11
12
  #--
12
13
  # == Developer Documentation (not for RDoc output)
@@ -142,7 +143,7 @@
142
143
  # Used:
143
144
  #
144
145
  # $ ruby optparse-test.rb -r
145
- # optparse-test.rb:9:in `<main>': missing argument: -r (Gem::OptionParser::MissingArgument)
146
+ # optparse-test.rb:9:in '<main>': missing argument: -r (Gem::OptionParser::MissingArgument)
146
147
  # $ ruby optparse-test.rb -r my-library
147
148
  # You required my-library!
148
149
  #
@@ -235,7 +236,7 @@
235
236
  # $ ruby optparse-test.rb --user 2
236
237
  # #<struct User id=2, name="Gandalf">
237
238
  # $ ruby optparse-test.rb --user 3
238
- # optparse-test.rb:15:in `block in find_user': No User Found for id 3 (RuntimeError)
239
+ # optparse-test.rb:15:in 'block in find_user': No User Found for id 3 (RuntimeError)
239
240
  #
240
241
  # === Store options to a Hash
241
242
  #
@@ -425,7 +426,8 @@
425
426
  #
426
427
  class Gem::OptionParser
427
428
  # The version string
428
- Gem::OptionParser::Version = "0.6.0"
429
+ VERSION = "0.8.0"
430
+ Version = VERSION # for compatibility
429
431
 
430
432
  # :stopdoc:
431
433
  NoArgument = [NO_ARGUMENT = :NONE, nil].freeze
@@ -461,6 +463,10 @@ class Gem::OptionParser
461
463
  candidates
462
464
  end
463
465
 
466
+ def self.completable?(key)
467
+ String.try_convert(key) or defined?(key.id2name)
468
+ end
469
+
464
470
  def candidate(key, icase = false, pat = nil, &_)
465
471
  Completion.candidate(key, icase, pat, &method(:each))
466
472
  end
@@ -496,7 +502,6 @@ class Gem::OptionParser
496
502
  end
497
503
  end
498
504
 
499
-
500
505
  #
501
506
  # Map from option/keyword string to object with completion.
502
507
  #
@@ -504,7 +509,6 @@ class Gem::OptionParser
504
509
  include Completion
505
510
  end
506
511
 
507
-
508
512
  #
509
513
  # Individual switch class. Not important to the user.
510
514
  #
@@ -546,11 +550,11 @@ class Gem::OptionParser
546
550
 
547
551
  def initialize(pattern = nil, conv = nil,
548
552
  short = nil, long = nil, arg = nil,
549
- desc = ([] if short or long), block = nil, &_block)
553
+ desc = ([] if short or long), block = nil, values = nil, &_block)
550
554
  raise if Array === pattern
551
555
  block ||= _block
552
- @pattern, @conv, @short, @long, @arg, @desc, @block =
553
- pattern, conv, short, long, arg, desc, block
556
+ @pattern, @conv, @short, @long, @arg, @desc, @block, @values =
557
+ pattern, conv, short, long, arg, desc, block, values
554
558
  end
555
559
 
556
560
  #
@@ -583,11 +587,15 @@ class Gem::OptionParser
583
587
  # exception.
584
588
  #
585
589
  def conv_arg(arg, val = []) # :nodoc:
590
+ v, = *val
586
591
  if conv
587
592
  val = conv.call(*val)
588
593
  else
589
594
  val = proc {|v| v}.call(*val)
590
595
  end
596
+ if @values
597
+ @values.include?(val) or raise InvalidArgument, v
598
+ end
591
599
  return arg, block, val
592
600
  end
593
601
  private :conv_arg
@@ -668,7 +676,7 @@ class Gem::OptionParser
668
676
 
669
677
  (sopts+lopts).each do |opt|
670
678
  # "(-x -c -r)-l[left justify]"
671
- if /^--\[no-\](.+)$/ =~ opt
679
+ if /\A--\[no-\](.+)$/ =~ opt
672
680
  o = $1
673
681
  yield("--#{o}", desc.join(""))
674
682
  yield("--no-#{o}", desc.join(""))
@@ -1032,7 +1040,6 @@ class Gem::OptionParser
1032
1040
  DefaultList.short['-'] = Switch::NoArgument.new {}
1033
1041
  DefaultList.long[''] = Switch::NoArgument.new {throw :terminate}
1034
1042
 
1035
-
1036
1043
  COMPSYS_HEADER = <<'XXX' # :nodoc:
1037
1044
 
1038
1045
  typeset -A opt_args
@@ -1051,16 +1058,16 @@ XXX
1051
1058
  end
1052
1059
 
1053
1060
  def help_exit
1054
- if STDOUT.tty? && (pager = ENV.values_at(*%w[RUBY_PAGER PAGER]).find {|e| e && !e.empty?})
1061
+ if $stdout.tty? && (pager = ENV.values_at(*%w[RUBY_PAGER PAGER]).find {|e| e && !e.empty?})
1055
1062
  less = ENV["LESS"]
1056
- args = [{"LESS" => "#{!less || less.empty? ? '-' : less}Fe"}, pager, "w"]
1063
+ args = [{"LESS" => "#{less} -Fe"}, pager, "w"]
1057
1064
  print = proc do |f|
1058
1065
  f.puts help
1059
1066
  rescue Errno::EPIPE
1060
1067
  # pager terminated
1061
1068
  end
1062
1069
  if Process.respond_to?(:fork) and false
1063
- IO.popen("-") {|f| f ? Process.exec(*args, in: f) : print.call(STDOUT)}
1070
+ IO.popen("-") {|f| f ? Process.exec(*args, in: f) : print.call($stdout)}
1064
1071
  # unreachable
1065
1072
  end
1066
1073
  IO.popen(*args, &print)
@@ -1102,7 +1109,7 @@ XXX
1102
1109
  #
1103
1110
  Officious['*-completion-zsh'] = proc do |parser|
1104
1111
  Switch::OptionalArgument.new do |arg|
1105
- parser.compsys(STDOUT, arg)
1112
+ parser.compsys($stdout, arg)
1106
1113
  exit
1107
1114
  end
1108
1115
  end
@@ -1288,7 +1295,15 @@ XXX
1288
1295
  # to $0.
1289
1296
  #
1290
1297
  def program_name
1291
- @program_name || File.basename($0, '.*')
1298
+ @program_name || strip_ext(File.basename($0))
1299
+ end
1300
+
1301
+ private def strip_ext(name) # :nodoc:
1302
+ exts = /#{
1303
+ require "rbconfig"
1304
+ Regexp.union(*RbConfig::CONFIG["EXECUTABLE_EXTS"]&.split(" "))
1305
+ }\z/o
1306
+ name.sub(exts, "")
1292
1307
  end
1293
1308
 
1294
1309
  # for experimental cascading :-)
@@ -1467,6 +1482,7 @@ XXX
1467
1482
  klass = nil
1468
1483
  q, a = nil
1469
1484
  has_arg = false
1485
+ values = nil
1470
1486
 
1471
1487
  opts.each do |o|
1472
1488
  # argument class
@@ -1480,7 +1496,7 @@ XXX
1480
1496
  end
1481
1497
 
1482
1498
  # directly specified pattern(any object possible to match)
1483
- if (!(String === o || Symbol === o)) and o.respond_to?(:match)
1499
+ if !Completion.completable?(o) and o.respond_to?(:match)
1484
1500
  pattern = notwice(o, pattern, 'pattern')
1485
1501
  if pattern.respond_to?(:convert)
1486
1502
  conv = pattern.method(:convert).to_proc
@@ -1494,7 +1510,12 @@ XXX
1494
1510
  case o
1495
1511
  when Proc, Method
1496
1512
  block = notwice(o, block, 'block')
1497
- when Array, Hash
1513
+ when Array, Hash, Set
1514
+ if Array === o
1515
+ o, v = o.partition {|v,| Completion.completable?(v)}
1516
+ values = notwice(v, values, 'values') unless v.empty?
1517
+ next if o.empty?
1518
+ end
1498
1519
  case pattern
1499
1520
  when CompletingHash
1500
1521
  when nil
@@ -1504,11 +1525,13 @@ XXX
1504
1525
  raise ArgumentError, "argument pattern given twice"
1505
1526
  end
1506
1527
  o.each {|pat, *v| pattern[pat] = v.fetch(0) {pat}}
1528
+ when Range
1529
+ values = notwice(o, values, 'values')
1507
1530
  when Module
1508
1531
  raise ArgumentError, "unsupported argument type: #{o}", ParseError.filter_backtrace(caller(4))
1509
1532
  when *ArgumentStyle.keys
1510
1533
  style = notwice(ArgumentStyle[o], style, 'style')
1511
- when /^--no-([^\[\]=\s]*)(.+)?/
1534
+ when /\A--no-([^\[\]=\s]*)(.+)?/
1512
1535
  q, a = $1, $2
1513
1536
  o = notwice(a ? Object : TrueClass, klass, 'type')
1514
1537
  not_pattern, not_conv = search(:atype, o) unless not_style
@@ -1519,7 +1542,7 @@ XXX
1519
1542
  (q = q.downcase).tr!('_', '-')
1520
1543
  long << "no-#{q}"
1521
1544
  nolong << q
1522
- when /^--\[no-\]([^\[\]=\s]*)(.+)?/
1545
+ when /\A--\[no-\]([^\[\]=\s]*)(.+)?/
1523
1546
  q, a = $1, $2
1524
1547
  o = notwice(a ? Object : TrueClass, klass, 'type')
1525
1548
  if a
@@ -1532,7 +1555,7 @@ XXX
1532
1555
  not_pattern, not_conv = search(:atype, FalseClass) unless not_style
1533
1556
  not_style = Switch::NoArgument
1534
1557
  nolong << "no-#{o}"
1535
- when /^--([^\[\]=\s]*)(.+)?/
1558
+ when /\A--([^\[\]=\s]*)(.+)?/
1536
1559
  q, a = $1, $2
1537
1560
  if a
1538
1561
  o = notwice(NilClass, klass, 'type')
@@ -1542,7 +1565,7 @@ XXX
1542
1565
  ldesc << "--#{q}"
1543
1566
  (o = q.downcase).tr!('_', '-')
1544
1567
  long << o
1545
- when /^-(\[\^?\]?(?:[^\\\]]|\\.)*\])(.+)?/
1568
+ when /\A-(\[\^?\]?(?:[^\\\]]|\\.)*\])(.+)?/
1546
1569
  q, a = $1, $2
1547
1570
  o = notwice(Object, klass, 'type')
1548
1571
  if a
@@ -1553,7 +1576,7 @@ XXX
1553
1576
  end
1554
1577
  sdesc << "-#{q}"
1555
1578
  short << Regexp.new(q)
1556
- when /^-(.)(.+)?/
1579
+ when /\A-(.)(.+)?/
1557
1580
  q, a = $1, $2
1558
1581
  if a
1559
1582
  o = notwice(NilClass, klass, 'type')
@@ -1562,7 +1585,7 @@ XXX
1562
1585
  end
1563
1586
  sdesc << "-#{q}"
1564
1587
  short << q
1565
- when /^=/
1588
+ when /\A=/
1566
1589
  style = notwice(default_style.guess(arg = o), style, 'style')
1567
1590
  default_pattern, conv = search(:atype, Object) unless default_pattern
1568
1591
  else
@@ -1571,12 +1594,18 @@ XXX
1571
1594
  end
1572
1595
 
1573
1596
  default_pattern, conv = search(:atype, default_style.pattern) unless default_pattern
1597
+ if Range === values and klass
1598
+ unless (!values.begin or klass === values.begin) and
1599
+ (!values.end or klass === values.end)
1600
+ raise ArgumentError, "range does not match class"
1601
+ end
1602
+ end
1574
1603
  if !(short.empty? and long.empty?)
1575
1604
  if has_arg and default_style == Switch::NoArgument
1576
1605
  default_style = Switch::RequiredArgument
1577
1606
  end
1578
1607
  s = (style || default_style).new(pattern || default_pattern,
1579
- conv, sdesc, ldesc, arg, desc, block)
1608
+ conv, sdesc, ldesc, arg, desc, block, values)
1580
1609
  elsif !block
1581
1610
  if style or pattern
1582
1611
  raise ArgumentError, "no switch given", ParseError.filter_backtrace(caller)
@@ -1585,7 +1614,7 @@ XXX
1585
1614
  else
1586
1615
  short << pattern
1587
1616
  s = (style || default_style).new(pattern,
1588
- conv, nil, nil, arg, desc, block)
1617
+ conv, nil, nil, arg, desc, block, values)
1589
1618
  end
1590
1619
  return s, short, long,
1591
1620
  (not_style.new(not_pattern, not_conv, sdesc, ldesc, nil, desc, block) if not_style),
@@ -1827,7 +1856,7 @@ XXX
1827
1856
  #
1828
1857
  def permute!(argv = default_argv, **keywords)
1829
1858
  nonopts = []
1830
- order!(argv, **keywords, &nonopts.method(:<<))
1859
+ order!(argv, **keywords) {|nonopt| nonopts << nonopt}
1831
1860
  argv[0, 0] = nonopts
1832
1861
  argv
1833
1862
  end
@@ -1880,13 +1909,16 @@ XXX
1880
1909
  single_options, *long_options = *args
1881
1910
 
1882
1911
  result = {}
1912
+ setter = (symbolize_names ?
1913
+ ->(name, val) {result[name.to_sym] = val}
1914
+ : ->(name, val) {result[name] = val})
1883
1915
 
1884
1916
  single_options.scan(/(.)(:)?/) do |opt, val|
1885
1917
  if val
1886
- result[opt] = nil
1918
+ setter[opt, nil]
1887
1919
  define("-#{opt} VAL")
1888
1920
  else
1889
- result[opt] = false
1921
+ setter[opt, false]
1890
1922
  define("-#{opt}")
1891
1923
  end
1892
1924
  end if single_options
@@ -1895,16 +1927,16 @@ XXX
1895
1927
  arg, desc = arg.split(';', 2)
1896
1928
  opt, val = arg.split(':', 2)
1897
1929
  if val
1898
- result[opt] = val.empty? ? nil : val
1930
+ setter[opt, (val unless val.empty?)]
1899
1931
  define("--#{opt}=#{result[opt] || "VAL"}", *[desc].compact)
1900
1932
  else
1901
- result[opt] = false
1933
+ setter[opt, false]
1902
1934
  define("--#{opt}", *[desc].compact)
1903
1935
  end
1904
1936
  end
1905
1937
 
1906
- parse_in_order(argv, result.method(:[]=), **keywords)
1907
- symbolize_names ? result.transform_keys(&:to_sym) : result
1938
+ parse_in_order(argv, setter, **keywords)
1939
+ result
1908
1940
  end
1909
1941
 
1910
1942
  #
@@ -1954,7 +1986,7 @@ XXX
1954
1986
  visit(:complete, typ, opt, icase, *pat) {|o, *sw| return sw}
1955
1987
  }
1956
1988
  exc = ambiguous ? AmbiguousOption : InvalidOption
1957
- raise exc.new(opt, additional: self.method(:additional_message).curry[typ])
1989
+ raise exc.new(opt, additional: proc {|o| additional_message(typ, o)})
1958
1990
  end
1959
1991
  private :complete
1960
1992
 
@@ -2019,19 +2051,27 @@ XXX
2019
2051
  def load(filename = nil, **keywords)
2020
2052
  unless filename
2021
2053
  basename = File.basename($0, '.*')
2022
- return true if load(File.expand_path(basename, '~/.options'), **keywords) rescue nil
2054
+ return true if load(File.expand_path("~/.options/#{basename}"), **keywords) rescue nil
2023
2055
  basename << ".options"
2056
+ if !(xdg = ENV['XDG_CONFIG_HOME']) or xdg.empty?
2057
+ # https://specifications.freedesktop.org/basedir-spec/latest/#variables
2058
+ #
2059
+ # If $XDG_CONFIG_HOME is either not set or empty, a default
2060
+ # equal to $HOME/.config should be used.
2061
+ xdg = ['~/.config', true]
2062
+ end
2024
2063
  return [
2025
- # XDG
2026
- ENV['XDG_CONFIG_HOME'],
2027
- '~/.config',
2064
+ xdg,
2065
+
2028
2066
  *ENV['XDG_CONFIG_DIRS']&.split(File::PATH_SEPARATOR),
2029
2067
 
2030
2068
  # Haiku
2031
- '~/config/settings',
2032
- ].any? {|dir|
2069
+ ['~/config/settings', true],
2070
+ ].any? {|dir, expand|
2033
2071
  next if !dir or dir.empty?
2034
- load(File.expand_path(basename, dir), **keywords) rescue nil
2072
+ filename = File.join(dir, basename)
2073
+ filename = File.expand_path(filename) if expand
2074
+ load(filename, **keywords) rescue nil
2035
2075
  }
2036
2076
  end
2037
2077
  begin
@@ -2237,9 +2277,10 @@ XXX
2237
2277
  argv
2238
2278
  end
2239
2279
 
2280
+ DIR = File.join(__dir__, '')
2240
2281
  def self.filter_backtrace(array)
2241
2282
  unless $DEBUG
2242
- array.delete_if(&%r"\A#{Regexp.quote(__FILE__)}:"o.method(:=~))
2283
+ array.delete_if {|bt| bt.start_with?(DIR)}
2243
2284
  end
2244
2285
  array
2245
2286
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'socket'
4
- require_relative '../../timeout/lib/timeout'
4
+ require_relative '../../../vendored_timeout'
5
5
  require 'io/wait'
6
6
  require_relative '../../../vendored_securerandom'
7
7
 
@@ -20,7 +20,7 @@
20
20
 
21
21
  module Gem::Timeout
22
22
  # The version
23
- VERSION = "0.4.3"
23
+ VERSION = "0.4.4"
24
24
 
25
25
  # Internal error raised to when a timeout is triggered.
26
26
  class ExitException < Exception
@@ -123,6 +123,9 @@ module Gem::Timeout
123
123
 
124
124
  def self.ensure_timeout_thread_created
125
125
  unless @timeout_thread and @timeout_thread.alive?
126
+ # If the Mutex is already owned we are in a signal handler.
127
+ # In that case, just return and let the main thread create the @timeout_thread.
128
+ return if TIMEOUT_THREAD_MUTEX.owned?
126
129
  TIMEOUT_THREAD_MUTEX.synchronize do
127
130
  unless @timeout_thread and @timeout_thread.alive?
128
131
  @timeout_thread = create_timeout_thread
@@ -30,6 +30,9 @@ module Gem::URI
30
30
  remove_const(:Parser) if defined?(::Gem::URI::Parser)
31
31
  const_set("Parser", parser.class)
32
32
 
33
+ remove_const(:PARSER) if defined?(::Gem::URI::PARSER)
34
+ const_set("PARSER", parser)
35
+
33
36
  remove_const(:REGEXP) if defined?(::Gem::URI::REGEXP)
34
37
  remove_const(:PATTERN) if defined?(::Gem::URI::PATTERN)
35
38
  if Parser == RFC2396_Parser
@@ -49,10 +52,10 @@ module Gem::URI
49
52
  warn "Gem::URI::REGEXP is obsolete. Use Gem::URI::RFC2396_REGEXP explicitly.", uplevel: 1 if $VERBOSE
50
53
  Gem::URI::RFC2396_REGEXP
51
54
  elsif value = RFC2396_PARSER.regexp[const]
52
- warn "Gem::URI::#{const} is obsolete. Use RFC2396_PARSER.regexp[#{const.inspect}] explicitly.", uplevel: 1 if $VERBOSE
55
+ warn "Gem::URI::#{const} is obsolete. Use Gem::URI::RFC2396_PARSER.regexp[#{const.inspect}] explicitly.", uplevel: 1 if $VERBOSE
53
56
  value
54
57
  elsif value = RFC2396_Parser.const_get(const)
55
- warn "Gem::URI::#{const} is obsolete. Use RFC2396_Parser::#{const} explicitly.", uplevel: 1 if $VERBOSE
58
+ warn "Gem::URI::#{const} is obsolete. Use Gem::URI::RFC2396_Parser::#{const} explicitly.", uplevel: 1 if $VERBOSE
56
59
  value
57
60
  else
58
61
  super
@@ -92,6 +95,40 @@ module Gem::URI
92
95
  end
93
96
 
94
97
  module Schemes # :nodoc:
98
+ class << self
99
+ ReservedChars = ".+-"
100
+ EscapedChars = "\u01C0\u01C1\u01C2"
101
+ # Use Lo category chars as escaped chars for TruffleRuby, which
102
+ # does not allow Symbol categories as identifiers.
103
+
104
+ def escape(name)
105
+ unless name and name.ascii_only?
106
+ return nil
107
+ end
108
+ name.upcase.tr(ReservedChars, EscapedChars)
109
+ end
110
+
111
+ def unescape(name)
112
+ name.tr(EscapedChars, ReservedChars).encode(Encoding::US_ASCII).upcase
113
+ end
114
+
115
+ def find(name)
116
+ const_get(name, false) if name and const_defined?(name, false)
117
+ end
118
+
119
+ def register(name, klass)
120
+ unless scheme = escape(name)
121
+ raise ArgumentError, "invalid character as scheme - #{name}"
122
+ end
123
+ const_set(scheme, klass)
124
+ end
125
+
126
+ def list
127
+ constants.map { |name|
128
+ [unescape(name.to_s), const_get(name)]
129
+ }.to_h
130
+ end
131
+ end
95
132
  end
96
133
  private_constant :Schemes
97
134
 
@@ -104,7 +141,7 @@ module Gem::URI
104
141
  # Note that after calling String#upcase on +scheme+, it must be a valid
105
142
  # constant name.
106
143
  def self.register_scheme(scheme, klass)
107
- Schemes.const_set(scheme.to_s.upcase, klass)
144
+ Schemes.register(scheme, klass)
108
145
  end
109
146
 
110
147
  # Returns a hash of the defined schemes:
@@ -122,14 +159,14 @@ module Gem::URI
122
159
  #
123
160
  # Related: Gem::URI.register_scheme.
124
161
  def self.scheme_list
125
- Schemes.constants.map { |name|
126
- [name.to_s.upcase, Schemes.const_get(name)]
127
- }.to_h
162
+ Schemes.list
128
163
  end
129
164
 
165
+ # :stopdoc:
130
166
  INITIAL_SCHEMES = scheme_list
131
167
  private_constant :INITIAL_SCHEMES
132
168
  Ractor.make_shareable(INITIAL_SCHEMES) if defined?(Ractor)
169
+ # :startdoc:
133
170
 
134
171
  # Returns a new object constructed from the given +scheme+, +arguments+,
135
172
  # and +default+:
@@ -148,12 +185,10 @@ module Gem::URI
148
185
  # # => #<Gem::URI::HTTP foo://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top>
149
186
  #
150
187
  def self.for(scheme, *arguments, default: Generic)
151
- const_name = scheme.to_s.upcase
188
+ const_name = Schemes.escape(scheme)
152
189
 
153
190
  uri_class = INITIAL_SCHEMES[const_name]
154
- uri_class ||= if /\A[A-Z]\w*\z/.match?(const_name) && Schemes.const_defined?(const_name, false)
155
- Schemes.const_get(const_name, false)
156
- end
191
+ uri_class ||= Schemes.find(const_name)
157
192
  uri_class ||= default
158
193
 
159
194
  return uri_class.new(scheme, *arguments)
@@ -195,7 +230,7 @@ module Gem::URI
195
230
  # ["fragment", "top"]]
196
231
  #
197
232
  def self.split(uri)
198
- DEFAULT_PARSER.split(uri)
233
+ PARSER.split(uri)
199
234
  end
200
235
 
201
236
  # Returns a new \Gem::URI object constructed from the given string +uri+:
@@ -205,11 +240,11 @@ module Gem::URI
205
240
  # Gem::URI.parse('http://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top')
206
241
  # # => #<Gem::URI::HTTP http://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top>
207
242
  #
208
- # It's recommended to first ::escape string +uri+
243
+ # It's recommended to first Gem::URI::RFC2396_PARSER.escape string +uri+
209
244
  # if it may contain invalid Gem::URI characters.
210
245
  #
211
246
  def self.parse(uri)
212
- DEFAULT_PARSER.parse(uri)
247
+ PARSER.parse(uri)
213
248
  end
214
249
 
215
250
  # Merges the given Gem::URI strings +str+
@@ -265,7 +300,7 @@ module Gem::URI
265
300
  #
266
301
  def self.extract(str, schemes = nil, &block) # :nodoc:
267
302
  warn "Gem::URI.extract is obsolete", uplevel: 1 if $VERBOSE
268
- DEFAULT_PARSER.extract(str, schemes, &block)
303
+ PARSER.extract(str, schemes, &block)
269
304
  end
270
305
 
271
306
  #
@@ -302,7 +337,7 @@ module Gem::URI
302
337
  #
303
338
  def self.regexp(schemes = nil)# :nodoc:
304
339
  warn "Gem::URI.regexp is obsolete", uplevel: 1 if $VERBOSE
305
- DEFAULT_PARSER.make_regexp(schemes)
340
+ PARSER.make_regexp(schemes)
306
341
  end
307
342
 
308
343
  TBLENCWWWCOMP_ = {} # :nodoc:
@@ -407,6 +442,8 @@ module Gem::URI
407
442
  _decode_uri_component(/%\h\h/, str, enc)
408
443
  end
409
444
 
445
+ # Returns a string derived from the given string +str+ with
446
+ # Gem::URI-encoded characters matching +regexp+ according to +table+.
410
447
  def self._encode_uri_component(regexp, table, str, enc)
411
448
  str = str.to_s.dup
412
449
  if str.encoding != Encoding::ASCII_8BIT
@@ -421,6 +458,8 @@ module Gem::URI
421
458
  end
422
459
  private_class_method :_encode_uri_component
423
460
 
461
+ # Returns a string decoding characters matching +regexp+ from the
462
+ # given \URL-encoded string +str+.
424
463
  def self._decode_uri_component(regexp, str, enc)
425
464
  raise ArgumentError, "invalid %-encoding (#{str})" if /%(?!\h\h)/.match?(str)
426
465
  str.b.gsub(regexp, TBLDECWWWCOMP_).force_encoding(enc)
@@ -859,6 +898,7 @@ module Gem
859
898
  # Returns a \Gem::URI object derived from the given +uri+,
860
899
  # which may be a \Gem::URI string or an existing \Gem::URI object:
861
900
  #
901
+ # require 'rubygems/vendor/uri/lib/uri'
862
902
  # # Returns a new Gem::URI.
863
903
  # uri = Gem::URI('http://github.com/ruby/ruby')
864
904
  # # => #<Gem::URI::HTTP http://github.com/ruby/ruby>
@@ -866,6 +906,8 @@ module Gem
866
906
  # Gem::URI(uri)
867
907
  # # => #<Gem::URI::HTTP http://github.com/ruby/ruby>
868
908
  #
909
+ # You must require 'rubygems/vendor/uri/lib/uri' to use this method.
910
+ #
869
911
  def URI(uri)
870
912
  if uri.is_a?(Gem::URI::Generic)
871
913
  uri
@@ -47,7 +47,7 @@ module Gem::URI
47
47
  # :path => '/ruby/src'})
48
48
  # uri2.to_s # => "file://host.example.com/ruby/src"
49
49
  #
50
- # uri3 = Gem::URI::File.build({:path => Gem::URI::escape('/path/my file.txt')})
50
+ # uri3 = Gem::URI::File.build({:path => Gem::URI::RFC2396_PARSER.escape('/path/my file.txt')})
51
51
  # uri3.to_s # => "file:///path/my%20file.txt"
52
52
  #
53
53
  def self.build(args)