rubygems-update 2.6.8 → 2.6.9

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

Potentially problematic release.


This version of rubygems-update might be problematic. Click here for more details.

Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +9 -6
  3. data/CODE_OF_CONDUCT.md +36 -33
  4. data/History.txt +16 -0
  5. data/Manifest.txt +5 -3
  6. data/Rakefile +5 -0
  7. data/bundler/CHANGELOG.md +72 -0
  8. data/bundler/DEVELOPMENT.md +2 -2
  9. data/bundler/README.md +5 -0
  10. data/bundler/lib/bundler.rb +1 -1
  11. data/bundler/lib/bundler/cli.rb +42 -29
  12. data/bundler/lib/bundler/cli/common.rb +17 -0
  13. data/bundler/lib/bundler/cli/exec.rb +6 -0
  14. data/bundler/lib/bundler/cli/gem.rb +16 -3
  15. data/bundler/lib/bundler/cli/install.rb +7 -20
  16. data/bundler/lib/bundler/cli/lock.rb +1 -1
  17. data/bundler/lib/bundler/cli/open.rb +2 -1
  18. data/bundler/lib/bundler/cli/outdated.rb +91 -43
  19. data/bundler/lib/bundler/cli/update.rb +3 -10
  20. data/bundler/lib/bundler/compact_index_client.rb +7 -1
  21. data/bundler/lib/bundler/current_ruby.rb +1 -0
  22. data/bundler/lib/bundler/definition.rb +9 -5
  23. data/bundler/lib/bundler/dependency.rb +12 -0
  24. data/bundler/lib/bundler/env.rb +25 -20
  25. data/bundler/lib/bundler/errors.rb +21 -0
  26. data/bundler/lib/bundler/fetcher.rb +2 -2
  27. data/bundler/lib/bundler/fetcher/compact_index.rb +15 -3
  28. data/bundler/lib/bundler/friendly_errors.rb +23 -7
  29. data/bundler/lib/bundler/index.rb +9 -4
  30. data/bundler/lib/bundler/inline.rb +1 -1
  31. data/bundler/lib/bundler/installer.rb +1 -1
  32. data/bundler/lib/bundler/installer/gem_installer.rb +2 -2
  33. data/bundler/lib/bundler/installer/parallel_installer.rb +40 -9
  34. data/bundler/lib/bundler/lockfile_parser.rb +0 -1
  35. data/bundler/lib/bundler/match_platform.rb +12 -4
  36. data/bundler/lib/bundler/plugin/api.rb +2 -1
  37. data/bundler/lib/bundler/plugin/api/source.rb +1 -1
  38. data/bundler/lib/bundler/postit_trampoline.rb +3 -3
  39. data/bundler/lib/bundler/resolver.rb +6 -1
  40. data/bundler/lib/bundler/retry.rb +4 -1
  41. data/bundler/lib/bundler/rubygems_gem_installer.rb +18 -6
  42. data/bundler/lib/bundler/rubygems_integration.rb +16 -3
  43. data/bundler/lib/bundler/settings.rb +8 -3
  44. data/bundler/lib/bundler/shared_helpers.rb +15 -12
  45. data/bundler/lib/bundler/source.rb +4 -0
  46. data/bundler/lib/bundler/source/git/git_proxy.rb +2 -1
  47. data/bundler/lib/bundler/source/rubygems.rb +9 -0
  48. data/bundler/lib/bundler/spec_set.rb +4 -0
  49. data/bundler/lib/bundler/templates/newgem/gitignore.tt +5 -0
  50. data/bundler/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +1 -1
  51. data/bundler/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +10 -1
  52. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +10 -1
  53. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +1 -1
  54. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +2 -2
  55. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +2 -2
  56. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +62 -0
  57. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +10 -3
  58. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +12 -1
  59. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +2 -2
  60. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  61. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +2 -0
  62. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  63. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +27 -19
  64. data/bundler/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/faster.rb +1 -0
  65. data/bundler/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent.rb +24 -23
  66. data/bundler/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent/ssl_reuse.rb +2 -1
  67. data/bundler/lib/bundler/vendored_persistent.rb +9 -4
  68. data/bundler/lib/bundler/version.rb +1 -1
  69. data/bundler/lib/bundler/worker.rb +27 -5
  70. data/bundler/man/bundle-config.ronn +28 -1
  71. data/bundler/man/bundle-install.ronn +1 -1
  72. data/bundler/man/bundle-lock.ronn +47 -0
  73. data/bundler/man/bundle-outdated.ronn +107 -0
  74. data/bundler/man/bundle-update.ronn +152 -3
  75. data/bundler/man/bundle.ronn +22 -4
  76. data/bundler/man/gemfile.5.ronn +16 -0
  77. data/lib/rubygems.rb +1 -1
  78. data/lib/rubygems/ext/ext_conf_builder.rb +5 -3
  79. data/lib/rubygems/ext/rake_builder.rb +1 -1
  80. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +3 -1
  81. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +9 -2
  82. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +2 -0
  83. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  84. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +17 -17
  85. data/lib/rubygems/server.rb +11 -4
  86. data/lib/rubygems/stub_specification.rb +6 -1
  87. data/lib/rubygems/version.rb +6 -2
  88. data/test/rubygems/test_gem.rb +2 -0
  89. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +23 -0
  90. data/test/rubygems/test_gem_ext_rake_builder.rb +34 -17
  91. data/test/rubygems/test_gem_server.rb +16 -0
  92. data/test/rubygems/test_gem_specification.rb +1 -1
  93. data/test/rubygems/test_gem_stub_specification.rb +61 -0
  94. data/test/rubygems/test_gem_version.rb +6 -0
  95. data/util/ci +5 -5
  96. metadata +31 -29
@@ -10,7 +10,7 @@ require 'rbconfig'
10
10
  require 'thread'
11
11
 
12
12
  module Gem
13
- VERSION = '2.6.8'
13
+ VERSION = "2.6.9"
14
14
  end
15
15
 
16
16
  # Must be first since it unloads the prelude from 1.9.2
@@ -48,9 +48,11 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
48
48
  run cmd, results
49
49
  ensure
50
50
  if File.exist? 'mkmf.log'
51
- results << "To see why this extension failed to compile, please check" \
52
- " the mkmf.log which can be found here:\n"
53
- results << " " + File.join(dest_path, 'mkmf.log') + "\n"
51
+ unless $?.success? then
52
+ results << "To see why this extension failed to compile, please check" \
53
+ " the mkmf.log which can be found here:\n"
54
+ results << " " + File.join(dest_path, 'mkmf.log') + "\n"
55
+ end
54
56
  FileUtils.mv 'mkmf.log', dest_path
55
57
  end
56
58
  siteconf.unlink
@@ -9,7 +9,7 @@ class Gem::Ext::RakeBuilder < Gem::Ext::Builder
9
9
 
10
10
  def self.build(extension, directory, dest_path, results, args=[], lib_dir=nil)
11
11
  if File.basename(extension) =~ /mkrf_conf/i then
12
- cmd = "#{Gem.ruby} #{File.basename extension}"
12
+ cmd = "#{Gem.ruby} #{File.basename extension}".dup
13
13
  cmd << " #{args.join " "}" unless args.empty?
14
14
  run cmd, results
15
15
  end
@@ -119,6 +119,7 @@ module Gem::Resolver::Molinillo
119
119
  # {Vertex#successors}
120
120
  def ==(other)
121
121
  return false unless other
122
+ return true if equal?(other)
122
123
  vertices.each do |name, vertex|
123
124
  other_vertex = other.vertex_named(name)
124
125
  return false unless other_vertex
@@ -134,6 +135,7 @@ module Gem::Resolver::Molinillo
134
135
  def add_child_vertex(name, payload, parent_names, requirement)
135
136
  root = !parent_names.delete(nil) { true }
136
137
  vertex = add_vertex(name, payload, root)
138
+ vertex.explicit_requirements << requirement if root
137
139
  parent_names.each do |parent_name|
138
140
  parent_node = vertex_named(parent_name)
139
141
  add_edge(parent_node, vertex, requirement)
@@ -152,7 +154,7 @@ module Gem::Resolver::Molinillo
152
154
  # Detaches the {#vertex_named} `name` {Vertex} from the graph, recursively
153
155
  # removing any non-root vertices that were orphaned in the process
154
156
  # @param [String] name
155
- # @return [void]
157
+ # @return [Array<Vertex>] the vertices which have been detached
156
158
  def detach_vertex_named(name)
157
159
  log.detach_vertex_named(self, name)
158
160
  end
@@ -14,16 +14,23 @@ module Gem::Resolver::Molinillo
14
14
 
15
15
  # (see Action#up)
16
16
  def up(graph)
17
- return unless @vertex = graph.vertices.delete(name)
17
+ return [] unless @vertex = graph.vertices.delete(name)
18
+
19
+ removed_vertices = [@vertex]
18
20
  @vertex.outgoing_edges.each do |e|
19
21
  v = e.destination
20
22
  v.incoming_edges.delete(e)
21
- graph.detach_vertex_named(v.name) unless v.root? || v.predecessors.any?
23
+ if !v.root? && v.incoming_edges.empty?
24
+ removed_vertices.concat graph.detach_vertex_named(v.name)
25
+ end
22
26
  end
27
+
23
28
  @vertex.incoming_edges.each do |e|
24
29
  v = e.origin
25
30
  v.outgoing_edges.delete(e)
26
31
  end
32
+
33
+ removed_vertices
27
34
  end
28
35
 
29
36
  # (see Action#down)
@@ -81,6 +81,7 @@ module Gem::Resolver::Molinillo
81
81
  # @return [Boolean] whether the two vertices are equal, determined
82
82
  # by a recursive traversal of each {Vertex#successors}
83
83
  def ==(other)
84
+ return true if equal?(other)
84
85
  shallow_eql?(other) &&
85
86
  successors.to_set == other.successors.to_set
86
87
  end
@@ -89,6 +90,7 @@ module Gem::Resolver::Molinillo
89
90
  # @return [Boolean] whether the two vertices are equal, determined
90
91
  # solely by {#name} and {#payload} equality
91
92
  def shallow_eql?(other)
93
+ return true if equal?(other)
92
94
  other &&
93
95
  name == other.name &&
94
96
  payload == other.payload
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  module Gem::Resolver::Molinillo
3
3
  # The version of Gem::Resolver::Molinillo.
4
- VERSION = '0.5.3'.freeze
4
+ VERSION = '0.5.5'.freeze
5
5
  end
@@ -194,18 +194,20 @@ module Gem::Resolver::Molinillo
194
194
  def state_index_for_unwind
195
195
  current_requirement = requirement
196
196
  existing_requirement = requirement_for_existing_name(name)
197
- until current_requirement.nil?
198
- current_state = find_state_for(current_requirement)
199
- return states.index(current_state) if state_any?(current_state)
200
- current_requirement = parent_of(current_requirement)
197
+ index = -1
198
+ [current_requirement, existing_requirement].each do |r|
199
+ until r.nil?
200
+ current_state = find_state_for(r)
201
+ if state_any?(current_state)
202
+ current_index = states.index(current_state)
203
+ index = current_index if current_index > index
204
+ break
205
+ end
206
+ r = parent_of(r)
207
+ end
201
208
  end
202
209
 
203
- until existing_requirement.nil?
204
- existing_state = find_state_for(existing_requirement)
205
- return states.index(existing_state) if state_any?(existing_state)
206
- existing_requirement = parent_of(existing_requirement)
207
- end
208
- -1
210
+ index
209
211
  end
210
212
 
211
213
  # @return [Object] the requirement that led to `requirement` being added
@@ -364,19 +366,17 @@ module Gem::Resolver::Molinillo
364
366
  if matching_deps.empty? && !succ.root? && succ.predecessors.to_a == [vertex]
365
367
  debug(depth) { "Removing orphaned spec #{succ.name} after swapping #{name}" }
366
368
  succ.requirements.each { |r| @parent_of.delete(r) }
367
- activated.detach_vertex_named(succ.name)
368
-
369
- all_successor_names = succ.recursive_successors.map(&:name)
370
369
 
371
- requirements.delete_if do |requirement|
372
- requirement_name = name_for(requirement)
373
- (requirement_name == succ.name) || all_successor_names.include?(requirement_name)
370
+ removed_names = activated.detach_vertex_named(succ.name).map(&:name)
371
+ requirements.delete_if do |r|
372
+ # the only removed vertices are those with no other requirements,
373
+ # so it's safe to delete only based upon name here
374
+ removed_names.include?(name_for(r))
374
375
  end
375
376
  elsif !matching_deps.include?(outgoing_edge.requirement)
376
377
  activated.delete_edge(outgoing_edge)
377
378
  requirements.delete(outgoing_edge.requirement)
378
379
  end
379
- matching_deps.delete(outgoing_edge.requirement)
380
380
  end
381
381
  end
382
382
 
@@ -2,6 +2,7 @@
2
2
  require 'webrick'
3
3
  require 'zlib'
4
4
  require 'erb'
5
+ require 'uri'
5
6
 
6
7
  require 'rubygems'
7
8
  require 'rubygems/rdoc'
@@ -68,7 +69,7 @@ class Gem::Server
68
69
  <h1>Summary</h1>
69
70
  <p>There are <%=values["gem_count"]%> gems installed:</p>
70
71
  <p>
71
- <%= values["specs"].map { |v| "<a href\"##{u v["name"]}\">#{h v["name"]}</a>" }.join ', ' %>.
72
+ <%= values["specs"].map { |v| "<a href=\"##{u v["name"]}\">#{h v["name"]}</a>" }.join ', ' %>.
72
73
  <h1>Gems</h1>
73
74
 
74
75
  <dl>
@@ -81,20 +82,20 @@ class Gem::Server
81
82
  <b><%=h spec["name"]%> <%=h spec["version"]%></b>
82
83
 
83
84
  <% if spec["ri_installed"] || spec["rdoc_installed"] then %>
84
- <a href="<%=u spec["doc_path"]%>">[rdoc]</a>
85
+ <a href="<%=spec["doc_path"]%>">[rdoc]</a>
85
86
  <% else %>
86
87
  <span title="rdoc not installed">[rdoc]</span>
87
88
  <% end %>
88
89
 
89
90
  <% if spec["homepage"] then %>
90
- <a href="<%=u spec["homepage"]%>" title="<%=h spec["homepage"]%>">[www]</a>
91
+ <a href="<%=uri_encode spec["homepage"]%>" title="<%=h spec["homepage"]%>">[www]</a>
91
92
  <% else %>
92
93
  <span title="no homepage available">[www]</span>
93
94
  <% end %>
94
95
 
95
96
  <% if spec["has_deps"] then %>
96
97
  - depends on
97
- <%= spec["dependencies"].map { |v| "<a href=\"##{u v["name"]}>#{h v["name"]}</a>" }.join ', ' %>.
98
+ <%= spec["dependencies"].map { |v| "<a href=\"##{u v["name"]}\">#{h v["name"]}</a>" }.join ', ' %>.
98
99
  <% end %>
99
100
  </dt>
100
101
  <dd>
@@ -455,6 +456,12 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
455
456
  end.max
456
457
  end
457
458
 
459
+ def uri_encode(str)
460
+ str.gsub(URI::UNSAFE) do |match|
461
+ match.each_byte.map { |c| sprintf('%%%02X', c.ord) }.join
462
+ end
463
+ end
464
+
458
465
  def doc_root gem_name
459
466
  if have_rdoc_4_plus? then
460
467
  "/doc_root/#{u gem_name}/"
@@ -39,7 +39,12 @@ class Gem::StubSpecification < Gem::BasicSpecification
39
39
  def initialize data, extensions
40
40
  parts = data[PREFIX.length..-1].split(" ".freeze, 4)
41
41
  @name = parts[0].freeze
42
- @version = Gem::Version.new parts[1]
42
+ @version = if Gem::Version.correct?(parts[1])
43
+ Gem::Version.new(parts[1])
44
+ else
45
+ Gem::Version.new(0)
46
+ end
47
+
43
48
  @platform = Gem::Platform.new parts[2]
44
49
  @extensions = extensions
45
50
  @full_name = if platform == Gem::Platform::RUBY
@@ -204,8 +204,12 @@ class Gem::Version
204
204
  # series of digits or ASCII letters separated by dots.
205
205
 
206
206
  def initialize version
207
- raise ArgumentError, "Malformed version number string #{version}" unless
208
- self.class.correct?(version)
207
+ unless self.class.correct?(version)
208
+ raise ArgumentError, "Malformed version number string #{version}"
209
+ end
210
+
211
+ # If version is an empty string convert it to 0
212
+ version = 0 if version =~ /\A\s*\Z/
209
213
 
210
214
  @version = version.to_s.strip.gsub("-",".pre.")
211
215
  @segments = nil
@@ -1451,6 +1451,7 @@ class TestGem < Gem::TestCase
1451
1451
  ENV['RUBYGEMS_GEMDEPS'] = "-"
1452
1452
 
1453
1453
  out = `#{Gem.ruby.dup.untaint} -I "#{LIB_PATH.untaint}" -rubygems -e "p Gem.loaded_specs.values.map(&:full_name).sort"`
1454
+ out.sub!(/, "openssl-#{Gem::Version::VERSION_PATTERN}"/, "")
1454
1455
 
1455
1456
  assert_equal '["a-1", "b-1", "c-1"]', out.strip
1456
1457
  end
@@ -1484,6 +1485,7 @@ class TestGem < Gem::TestCase
1484
1485
  out = Dir.chdir "sub1" do
1485
1486
  `#{Gem.ruby.dup.untaint} -I "#{LIB_PATH.untaint}" -rubygems -e "p Gem.loaded_specs.values.map(&:full_name).sort"`
1486
1487
  end
1488
+ out.sub!(/, "openssl-#{Gem::Version::VERSION_PATTERN}"/, "")
1487
1489
 
1488
1490
  Dir.rmdir "sub1"
1489
1491
 
@@ -111,6 +111,29 @@ class TestGemExtExtConfBuilder < Gem::TestCase
111
111
 
112
112
  assert_match(/^#{Gem.ruby}.* extconf.rb/, output[1])
113
113
  assert_match(File.join(@dest_path, 'mkmf.log'), output[4])
114
+ assert_includes(output, "To see why this extension failed to compile, please check the mkmf.log which can be found here:\n")
115
+
116
+ assert_path_exists File.join @dest_path, 'mkmf.log'
117
+ end
118
+
119
+ def test_class_build_extconf_success_without_warning
120
+ if vc_windows? && !nmake_found?
121
+ skip("test_class_build_extconf_fail skipped - nmake not found")
122
+ end
123
+
124
+ File.open File.join(@ext, 'extconf.rb'), 'w' do |extconf|
125
+ extconf.puts "require 'mkmf'"
126
+ extconf.puts "File.open('mkmf.log', 'w'){|f| f.write('a')}"
127
+ extconf.puts "create_makefile 'foo'"
128
+ end
129
+
130
+ output = []
131
+
132
+ Dir.chdir @ext do
133
+ Gem::Ext::ExtConfBuilder.build 'extconf.rb', nil, @dest_path, output
134
+ end
135
+
136
+ refute_includes(output, "To see why this extension failed to compile, please check the mkmf.log which can be found here:\n")
114
137
 
115
138
  assert_path_exists File.join @dest_path, 'mkmf.log'
116
139
  end
@@ -14,14 +14,7 @@ class TestGemExtRakeBuilder < Gem::TestCase
14
14
  end
15
15
 
16
16
  def test_class_build
17
- File.open File.join(@ext, 'mkrf_conf.rb'), 'w' do |mkrf_conf|
18
- mkrf_conf.puts <<-EO_MKRF
19
- File.open("Rakefile","w") do |f|
20
- f.puts "task :default"
21
- end
22
- EO_MKRF
23
- end
24
-
17
+ create_temp_mkrf_file('task :default')
25
18
  output = []
26
19
  realdir = nil # HACK /tmp vs. /private/tmp
27
20
 
@@ -39,15 +32,31 @@ class TestGemExtRakeBuilder < Gem::TestCase
39
32
  end
40
33
  end
41
34
 
42
- def test_class_build_fail
43
- File.open File.join(@ext, 'mkrf_conf.rb'), 'w' do |mkrf_conf|
44
- mkrf_conf.puts <<-EO_MKRF
45
- File.open("Rakefile","w") do |f|
46
- f.puts "task :default do abort 'fail' end"
47
- end
48
- EO_MKRF
35
+ # https://github.com/rubygems/rubygems/pull/1819
36
+ #
37
+ # It should not fail with a non-empty args list either
38
+ def test_class_build_with_args
39
+ create_temp_mkrf_file('task :default')
40
+ output = []
41
+ realdir = nil # HACK /tmp vs. /private/tmp
42
+
43
+ build_rake_in do |rake|
44
+ Dir.chdir @ext do
45
+ realdir = Dir.pwd
46
+ non_empty_args_list = ['']
47
+ Gem::Ext::RakeBuilder.build 'mkrf_conf.rb', nil, @dest_path, output, non_empty_args_list
48
+ end
49
+
50
+ output = output.join "\n"
51
+
52
+ refute_match %r%^rake failed:%, output
53
+ assert_match %r%^#{Regexp.escape @@ruby} mkrf_conf\.rb%, output
54
+ assert_match %r%^#{Regexp.escape rake} RUBYARCHDIR=#{Regexp.escape @dest_path} RUBYLIBDIR=#{Regexp.escape @dest_path}%, output
49
55
  end
56
+ end
50
57
 
58
+ def test_class_build_fail
59
+ create_temp_mkrf_file("task :default do abort 'fail' end")
51
60
  output = []
52
61
 
53
62
  build_rake_in(false) do |rake|
@@ -60,6 +69,14 @@ class TestGemExtRakeBuilder < Gem::TestCase
60
69
  assert_match %r%^rake failed%, error.message
61
70
  end
62
71
  end
63
-
72
+
73
+ def create_temp_mkrf_file(rakefile_content)
74
+ File.open File.join(@ext, 'mkrf_conf.rb'), 'w' do |mkrf_conf|
75
+ mkrf_conf.puts <<-EO_MKRF
76
+ File.open("Rakefile","w") do |f|
77
+ f.puts "#{rakefile_content}"
78
+ end
79
+ EO_MKRF
80
+ end
81
+ end
64
82
  end
65
-
@@ -392,6 +392,22 @@ class TestGemServer < Gem::TestCase
392
392
  Marshal.load(Gem.gunzip(@res.body))
393
393
  end
394
394
 
395
+ def test_uri_encode
396
+ url_safe = @server.uri_encode 'http://rubyonrails.org/">malicious_content</a>'
397
+ assert_equal url_safe, 'http://rubyonrails.org/%22%3Emalicious_content%3C/a%3E'
398
+ end
399
+
400
+ # Regression test for issue #1793: incorrect URL encoding.
401
+ # Checking that no URLs have had '://' incorrectly encoded
402
+ def test_regression_1793
403
+ data = StringIO.new "GET / HTTP/1.0\r\n\r\n"
404
+ @req.parse data
405
+
406
+ @server.root @req, @res
407
+
408
+ refute_match %r|%3A%2F%2F|, @res.body
409
+ end
410
+
395
411
  def util_listen
396
412
  webrick = Object.new
397
413
  webrick.instance_variable_set :@listeners, []
@@ -1260,7 +1260,7 @@ dependencies: []
1260
1260
  s.version = '1'
1261
1261
  end
1262
1262
 
1263
- spec.instance_variable_set :@licenses, :blah
1263
+ spec.instance_variable_set :@licenses, (class << (Object.new);self;end)
1264
1264
  spec.loaded_from = '/path/to/file'
1265
1265
 
1266
1266
  e = assert_raises Gem::FormatException do
@@ -33,6 +33,20 @@ class TestStubSpecification < Gem::TestCase
33
33
  assert_equal %w[ext/stub_e/extconf.rb], stub.extensions
34
34
  end
35
35
 
36
+ def test_initialize_version
37
+ stub = stub_with_version
38
+
39
+ assert_equal 'stub_v', stub.name
40
+ assert_equal v(2), stub.version
41
+ end
42
+
43
+ def test_initialize_with_empty_version
44
+ stub = stub_without_version
45
+
46
+ assert_equal 'stub_v', stub.name
47
+ assert_equal v(0), stub.version
48
+ end
49
+
36
50
  def test_initialize_missing_stubline
37
51
  stub = Gem::StubSpecification.gemspec_stub(BAR, @base_dir, @gems_dir)
38
52
  assert_equal "bar", stub.name
@@ -164,6 +178,53 @@ class TestStubSpecification < Gem::TestCase
164
178
  assert stub.to_spec.instance_variable_get :@ignored
165
179
  end
166
180
 
181
+ def stub_with_version
182
+ spec = File.join @gemhome, 'specifications', 'stub_e-2.gemspec'
183
+ open spec, 'w' do |io|
184
+ io.write <<-STUB
185
+ # -*- encoding: utf-8 -*-
186
+ # stub: stub_v 2 ruby lib
187
+
188
+ Gem::Specification.new do |s|
189
+ s.name = 'stub_v'
190
+ s.version = Gem::Version.new '2'
191
+ end
192
+ STUB
193
+
194
+ io.flush
195
+
196
+ stub = Gem::StubSpecification.gemspec_stub io.path, @gemhome, File.join(@gemhome, 'gems')
197
+
198
+ yield stub if block_given?
199
+
200
+ return stub
201
+ end
202
+ end
203
+
204
+ def stub_without_version
205
+ spec = File.join @gemhome, 'specifications', 'stub-2.gemspec'
206
+ open spec, 'w' do |io|
207
+ io.write <<-STUB
208
+ # -*- encoding: utf-8 -*-
209
+ # stub: stub_v ruby lib
210
+
211
+ Gem::Specification.new do |s|
212
+ s.name = 'stub_v'
213
+ s.version = ""
214
+ end
215
+ STUB
216
+
217
+ io.flush
218
+
219
+ stub = Gem::StubSpecification.gemspec_stub io.path, @gemhome, File.join(@gemhome, 'gems')
220
+
221
+ yield stub if block_given?
222
+
223
+ return stub
224
+ end
225
+
226
+ end
227
+
167
228
  def stub_with_extension
168
229
  spec = File.join @gemhome, 'specifications', 'stub_e-2.gemspec'
169
230
  open spec, 'w' do |io|