Skip to content

Commit 8323a43

Browse files
authored
Fix page links returning 404 in server mode (ruby#1671)
## Summary - `TopLevel#parser=` was passing `absolute_name` to `Store#update_parser_of_file`, but `@files_hash` is keyed by `relative_name`. The lookup always failed, so `@text_files_hash` was never populated and `find_text_page` always returned nil — making every page link in the sidebar 404. - Changed the call to pass `relative_name` instead, and renamed the parameter in `update_parser_of_file` for consistency. - Added a unit test for the deferred-parser path and integration tests for server page routing.
1 parent eebec45 commit 8323a43

File tree

4 files changed

+86
-5
lines changed

4 files changed

+86
-5
lines changed

lib/rdoc/code_object/top_level.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def initialize(absolute_name, relative_name = absolute_name)
6666

6767
def parser=(val)
6868
@parser = val
69-
@store.update_parser_of_file(absolute_name, val) if @store
69+
@store&.cache_text_file(relative_name)
7070
@parser
7171
end
7272

lib/rdoc/store.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -321,11 +321,11 @@ def resolve_c_superclasses
321321
end
322322

323323
##
324-
# Sets the parser of +absolute_name+, unless it from a source code file.
324+
# Caches +relative_name+ in the text files hash, if it is a text file.
325325

326-
def update_parser_of_file(absolute_name, parser)
327-
if top_level = @files_hash[absolute_name] then
328-
@text_files_hash[absolute_name] = top_level if top_level.text?
326+
def cache_text_file(relative_name)
327+
if top_level = @files_hash[relative_name]
328+
@text_files_hash[relative_name] = top_level if top_level.text?
329329
end
330330
end
331331

test/rdoc/rdoc_server_test.rb

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# frozen_string_literal: true
2+
require_relative 'support/test_case'
3+
4+
class RDocServerTest < RDoc::TestCase
5+
6+
def setup
7+
super
8+
9+
@dir = Dir.mktmpdir("test_rdoc_server_")
10+
11+
File.write File.join(@dir, "PAGE.md"), "# A Page\n\nSome content.\n"
12+
File.write File.join(@dir, "NOTES.rdoc"), "= Notes\n\nSome notes.\n"
13+
File.write File.join(@dir, "example.rb"), "# A class\nclass Example; end\n"
14+
15+
@options.files = [@dir]
16+
@options.op_dir = File.join(@dir, "_site")
17+
@options.root = Pathname(@dir)
18+
@options.verbosity = 0
19+
@options.finish
20+
21+
@rdoc.options = @options
22+
@rdoc.store = RDoc::Store.new(@options)
23+
24+
capture_output do
25+
@rdoc.parse_files @options.files
26+
end
27+
@rdoc.store.complete @options.visibility
28+
29+
@server = RDoc::Server.new(@rdoc, 0)
30+
end
31+
32+
def teardown
33+
FileUtils.rm_rf @dir
34+
super
35+
end
36+
37+
def test_route_serves_text_page
38+
status, content_type, body = @server.send(:route, '/PAGE_md.html')
39+
40+
assert_equal 200, status
41+
assert_equal 'text/html', content_type
42+
assert_include body, 'A Page'
43+
end
44+
45+
def test_route_serves_rdoc_text_page
46+
status, content_type, body = @server.send(:route, '/NOTES_rdoc.html')
47+
48+
assert_equal 200, status
49+
assert_equal 'text/html', content_type
50+
assert_include body, 'Notes'
51+
end
52+
53+
def test_route_serves_class_page
54+
status, content_type, body = @server.send(:route, '/Example.html')
55+
56+
assert_equal 200, status
57+
assert_equal 'text/html', content_type
58+
assert_include body, 'Example'
59+
end
60+
61+
def test_route_serves_index
62+
status, content_type, _body = @server.send(:route, '/')
63+
64+
assert_equal 200, status
65+
assert_equal 'text/html', content_type
66+
end
67+
68+
def test_route_returns_404_for_missing_page
69+
status, content_type, _body = @server.send(:route, '/nonexistent.html')
70+
71+
assert_equal 404, status
72+
assert_equal 'text/html', content_type
73+
end
74+
end

test/rdoc/rdoc_store_test.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,13 @@ def test_find_text_page
348348
assert_equal page, @store.find_text_page('PAGE.txt')
349349
end
350350

351+
def test_find_text_page_when_parser_set_after_add_file
352+
page = @store.add_file '/absolute/path/to/PAGE.md', relative_name: 'PAGE.md'
353+
page.parser = RDoc::Parser::Simple
354+
355+
assert_equal page, @store.find_text_page('PAGE.md')
356+
end
357+
351358
def test_friendly_path
352359
@orig_xdg_data_home = ENV.delete('XDG_DATA_HOME')
353360

0 commit comments

Comments
 (0)