Skip to content

Commit

Permalink
Allow paths traversing above the root - in nav and extra_ (#3010)
Browse files Browse the repository at this point in the history
+ Refactor and expand tests for normalize_url
  • Loading branch information
oprypin committed May 9, 2023
1 parent 5c9e4dc commit 566a5bd
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 191 deletions.
5 changes: 4 additions & 1 deletion mkdocs/structure/pages.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,10 @@ def _indent_print(self, depth=0):
@property
def url(self) -> str:
"""The URL of the page relative to the MkDocs `site_dir`."""
return '' if self.file.url in ('.', './') else self.file.url
url = self.file.url
if url in ('.', './'):
return ''
return url

file: File
"""The documentation [`File`][mkdocs.structure.files.File] that the page is being rendered from."""
Expand Down
34 changes: 16 additions & 18 deletions mkdocs/tests/structure/file_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,6 @@ def test_get_relative_url_use_directory_urls(self):
'foo/bar.md',
'foo/bar/baz.md',
]

to_file_urls = [
'./',
'foo/',
Expand All @@ -477,6 +476,8 @@ def test_get_relative_url_use_directory_urls(self):
]

from_file = File('img.jpg', '/path/to/docs', '/path/to/site', use_directory_urls=True)
self.assertEqual(from_file.url, 'img.jpg')

expected = [
'img.jpg', # img.jpg relative to .
'../img.jpg', # img.jpg relative to foo/
Expand All @@ -486,15 +487,15 @@ def test_get_relative_url_use_directory_urls(self):
'../../img.jpg', # img.jpg relative to foo/bar
'../../../img.jpg', # img.jpg relative to foo/bar/baz
]

for i, filename in enumerate(to_files):
file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=True)
self.assertEqual(from_file.url, 'img.jpg')
self.assertEqual(file.url, to_file_urls[i])
self.assertEqual(from_file.url_relative_to(file.url), expected[i])
self.assertEqual(from_file.url_relative_to(file), expected[i])

from_file = File('foo/img.jpg', '/path/to/docs', '/path/to/site', use_directory_urls=True)
self.assertEqual(from_file.url, 'foo/img.jpg')

expected = [
'foo/img.jpg', # foo/img.jpg relative to .
'img.jpg', # foo/img.jpg relative to foo/
Expand All @@ -504,15 +505,15 @@ def test_get_relative_url_use_directory_urls(self):
'../img.jpg', # foo/img.jpg relative to foo/bar
'../../img.jpg', # foo/img.jpg relative to foo/bar/baz
]

for i, filename in enumerate(to_files):
file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=True)
self.assertEqual(from_file.url, 'foo/img.jpg')
self.assertEqual(file.url, to_file_urls[i])
self.assertEqual(from_file.url_relative_to(file.url), expected[i])
self.assertEqual(from_file.url_relative_to(file), expected[i])

from_file = File('index.html', '/path/to/docs', '/path/to/site', use_directory_urls=True)
self.assertEqual(from_file.url, './')

expected = [
'./', # . relative to .
'../', # . relative to foo/
Expand All @@ -522,15 +523,15 @@ def test_get_relative_url_use_directory_urls(self):
'../../', # . relative to foo/bar
'../../../', # . relative to foo/bar/baz
]

for i, filename in enumerate(to_files):
file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=True)
self.assertEqual(from_file.url, './')
self.assertEqual(file.url, to_file_urls[i])
self.assertEqual(from_file.url_relative_to(file.url), expected[i])
self.assertEqual(from_file.url_relative_to(file), expected[i])

from_file = File('file.md', '/path/to/docs', '/path/to/site', use_directory_urls=True)
self.assertEqual(from_file.url, 'file/')

expected = [
'file/', # file relative to .
'../file/', # file relative to foo/
Expand All @@ -540,10 +541,8 @@ def test_get_relative_url_use_directory_urls(self):
'../../file/', # file relative to foo/bar
'../../../file/', # file relative to foo/bar/baz
]

for i, filename in enumerate(to_files):
file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=True)
self.assertEqual(from_file.url, 'file/')
self.assertEqual(file.url, to_file_urls[i])
self.assertEqual(from_file.url_relative_to(file.url), expected[i])
self.assertEqual(from_file.url_relative_to(file), expected[i])
Expand All @@ -558,7 +557,6 @@ def test_get_relative_url(self):
'foo/bar.md',
'foo/bar/baz.md',
]

to_file_urls = [
'index.html',
'foo/index.html',
Expand All @@ -570,6 +568,8 @@ def test_get_relative_url(self):
]

from_file = File('img.jpg', '/path/to/docs', '/path/to/site', use_directory_urls=False)
self.assertEqual(from_file.url, 'img.jpg')

expected = [
'img.jpg', # img.jpg relative to .
'../img.jpg', # img.jpg relative to foo/
Expand All @@ -579,16 +579,16 @@ def test_get_relative_url(self):
'../img.jpg', # img.jpg relative to foo/bar.html
'../../img.jpg', # img.jpg relative to foo/bar/baz.html
]

for i, filename in enumerate(to_files):
with self.subTest(from_file=from_file.src_path, to_file=filename):
file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=False)
self.assertEqual(from_file.url, 'img.jpg')
self.assertEqual(file.url, to_file_urls[i])
self.assertEqual(from_file.url_relative_to(file.url), expected[i])
self.assertEqual(from_file.url_relative_to(file), expected[i])

from_file = File('foo/img.jpg', '/path/to/docs', '/path/to/site', use_directory_urls=False)
self.assertEqual(from_file.url, 'foo/img.jpg')

expected = [
'foo/img.jpg', # foo/img.jpg relative to .
'img.jpg', # foo/img.jpg relative to foo/
Expand All @@ -598,16 +598,16 @@ def test_get_relative_url(self):
'img.jpg', # foo/img.jpg relative to foo/bar.html
'../img.jpg', # foo/img.jpg relative to foo/bar/baz.html
]

for i, filename in enumerate(to_files):
with self.subTest(from_file=from_file.src_path, to_file=filename):
file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=False)
self.assertEqual(from_file.url, 'foo/img.jpg')
self.assertEqual(file.url, to_file_urls[i])
self.assertEqual(from_file.url_relative_to(file.url), expected[i])
self.assertEqual(from_file.url_relative_to(file), expected[i])

from_file = File('index.html', '/path/to/docs', '/path/to/site', use_directory_urls=False)
self.assertEqual(from_file.url, 'index.html')

expected = [
'index.html', # index.html relative to .
'../index.html', # index.html relative to foo/
Expand All @@ -617,16 +617,16 @@ def test_get_relative_url(self):
'../index.html', # index.html relative to foo/bar.html
'../../index.html', # index.html relative to foo/bar/baz.html
]

for i, filename in enumerate(to_files):
with self.subTest(from_file=from_file.src_path, to_file=filename):
file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=False)
self.assertEqual(from_file.url, 'index.html')
self.assertEqual(file.url, to_file_urls[i])
self.assertEqual(from_file.url_relative_to(file.url), expected[i])
self.assertEqual(from_file.url_relative_to(file), expected[i])

from_file = File('file.html', '/path/to/docs', '/path/to/site', use_directory_urls=False)
self.assertEqual(from_file.url, 'file.html')

expected = [
'file.html', # file.html relative to .
'../file.html', # file.html relative to foo/
Expand All @@ -636,11 +636,9 @@ def test_get_relative_url(self):
'../file.html', # file.html relative to foo/bar.html
'../../file.html', # file.html relative to foo/bar/baz.html
]

for i, filename in enumerate(to_files):
with self.subTest(from_file=from_file.src_path, to_file=filename):
file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=False)
self.assertEqual(from_file.url, 'file.html')
self.assertEqual(file.url, to_file_urls[i])
self.assertEqual(from_file.url_relative_to(file.url), expected[i])
self.assertEqual(from_file.url_relative_to(file), expected[i])
Expand Down
Loading

0 comments on commit 566a5bd

Please sign in to comment.