file_tests.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  1. import unittest
  2. import os
  3. from unittest import mock
  4. from mkdocs.structure.files import Files, File, get_files, _sort_files, _filter_paths
  5. from mkdocs.tests.base import load_config, tempdir, PathAssertionMixin
  6. class TestFiles(PathAssertionMixin, unittest.TestCase):
  7. def test_file_eq(self):
  8. file = File('a.md', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  9. self.assertTrue(file == File('a.md', '/path/to/docs', '/path/to/site', use_directory_urls=False))
  10. def test_file_ne(self):
  11. file = File('a.md', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  12. # Different filename
  13. self.assertTrue(file != File('b.md', '/path/to/docs', '/path/to/site', use_directory_urls=False))
  14. # Different src_path
  15. self.assertTrue(file != File('a.md', '/path/to/other', '/path/to/site', use_directory_urls=False))
  16. # Different URL
  17. self.assertTrue(file != File('a.md', '/path/to/docs', '/path/to/site', use_directory_urls=True))
  18. def test_sort_files(self):
  19. self.assertEqual(
  20. _sort_files(['b.md', 'bb.md', 'a.md', 'index.md', 'aa.md']),
  21. ['index.md', 'a.md', 'aa.md', 'b.md', 'bb.md']
  22. )
  23. self.assertEqual(
  24. _sort_files(['b.md', 'index.html', 'a.md', 'index.md']),
  25. ['index.html', 'index.md', 'a.md', 'b.md']
  26. )
  27. self.assertEqual(
  28. _sort_files(['a.md', 'index.md', 'b.md', 'index.html']),
  29. ['index.md', 'index.html', 'a.md', 'b.md']
  30. )
  31. self.assertEqual(
  32. _sort_files(['.md', '_.md', 'a.md', 'index.md', '1.md']),
  33. ['index.md', '.md', '1.md', '_.md', 'a.md']
  34. )
  35. self.assertEqual(
  36. _sort_files(['a.md', 'b.md', 'a.md']),
  37. ['a.md', 'a.md', 'b.md']
  38. )
  39. self.assertEqual(
  40. _sort_files(['A.md', 'B.md', 'README.md']),
  41. ['README.md', 'A.md', 'B.md']
  42. )
  43. def test_md_file(self):
  44. f = File('foo.md', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  45. self.assertPathsEqual(f.src_path, 'foo.md')
  46. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo.md')
  47. self.assertPathsEqual(f.dest_path, 'foo.html')
  48. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo.html')
  49. self.assertEqual(f.url, 'foo.html')
  50. self.assertEqual(f.name, 'foo')
  51. self.assertTrue(f.is_documentation_page())
  52. self.assertFalse(f.is_static_page())
  53. self.assertFalse(f.is_media_file())
  54. self.assertFalse(f.is_javascript())
  55. self.assertFalse(f.is_css())
  56. def test_md_file_use_directory_urls(self):
  57. f = File('foo.md', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  58. self.assertPathsEqual(f.src_path, 'foo.md')
  59. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo.md')
  60. self.assertPathsEqual(f.dest_path, 'foo/index.html')
  61. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo/index.html')
  62. self.assertEqual(f.url, 'foo/')
  63. self.assertEqual(f.name, 'foo')
  64. self.assertTrue(f.is_documentation_page())
  65. self.assertFalse(f.is_static_page())
  66. self.assertFalse(f.is_media_file())
  67. self.assertFalse(f.is_javascript())
  68. self.assertFalse(f.is_css())
  69. def test_md_file_nested(self):
  70. f = File('foo/bar.md', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  71. self.assertPathsEqual(f.src_path, 'foo/bar.md')
  72. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo/bar.md')
  73. self.assertPathsEqual(f.dest_path, 'foo/bar.html')
  74. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo/bar.html')
  75. self.assertEqual(f.url, 'foo/bar.html')
  76. self.assertEqual(f.name, 'bar')
  77. self.assertTrue(f.is_documentation_page())
  78. self.assertFalse(f.is_static_page())
  79. self.assertFalse(f.is_media_file())
  80. self.assertFalse(f.is_javascript())
  81. self.assertFalse(f.is_css())
  82. def test_md_file_nested_use_directory_urls(self):
  83. f = File('foo/bar.md', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  84. self.assertPathsEqual(f.src_path, 'foo/bar.md')
  85. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo/bar.md')
  86. self.assertPathsEqual(f.dest_path, 'foo/bar/index.html')
  87. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo/bar/index.html')
  88. self.assertEqual(f.url, 'foo/bar/')
  89. self.assertEqual(f.name, 'bar')
  90. self.assertTrue(f.is_documentation_page())
  91. self.assertFalse(f.is_static_page())
  92. self.assertFalse(f.is_media_file())
  93. self.assertFalse(f.is_javascript())
  94. self.assertFalse(f.is_css())
  95. def test_md_index_file(self):
  96. f = File('index.md', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  97. self.assertPathsEqual(f.src_path, 'index.md')
  98. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/index.md')
  99. self.assertPathsEqual(f.dest_path, 'index.html')
  100. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/index.html')
  101. self.assertEqual(f.url, 'index.html')
  102. self.assertEqual(f.name, 'index')
  103. self.assertTrue(f.is_documentation_page())
  104. self.assertFalse(f.is_static_page())
  105. self.assertFalse(f.is_media_file())
  106. self.assertFalse(f.is_javascript())
  107. self.assertFalse(f.is_css())
  108. def test_md_readme_index_file(self):
  109. f = File('README.md', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  110. self.assertPathsEqual(f.src_path, 'README.md')
  111. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/README.md')
  112. self.assertPathsEqual(f.dest_path, 'index.html')
  113. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/index.html')
  114. self.assertEqual(f.url, 'index.html')
  115. self.assertEqual(f.name, 'index')
  116. self.assertTrue(f.is_documentation_page())
  117. self.assertFalse(f.is_static_page())
  118. self.assertFalse(f.is_media_file())
  119. self.assertFalse(f.is_javascript())
  120. self.assertFalse(f.is_css())
  121. def test_md_index_file_use_directory_urls(self):
  122. f = File('index.md', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  123. self.assertPathsEqual(f.src_path, 'index.md')
  124. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/index.md')
  125. self.assertPathsEqual(f.dest_path, 'index.html')
  126. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/index.html')
  127. self.assertEqual(f.url, '.')
  128. self.assertEqual(f.name, 'index')
  129. self.assertTrue(f.is_documentation_page())
  130. self.assertFalse(f.is_static_page())
  131. self.assertFalse(f.is_media_file())
  132. self.assertFalse(f.is_javascript())
  133. self.assertFalse(f.is_css())
  134. def test_md_readme_index_file_use_directory_urls(self):
  135. f = File('README.md', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  136. self.assertPathsEqual(f.src_path, 'README.md')
  137. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/README.md')
  138. self.assertPathsEqual(f.dest_path, 'index.html')
  139. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/index.html')
  140. self.assertEqual(f.url, '.')
  141. self.assertEqual(f.name, 'index')
  142. self.assertTrue(f.is_documentation_page())
  143. self.assertFalse(f.is_static_page())
  144. self.assertFalse(f.is_media_file())
  145. self.assertFalse(f.is_javascript())
  146. self.assertFalse(f.is_css())
  147. def test_md_index_file_nested(self):
  148. f = File('foo/index.md', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  149. self.assertPathsEqual(f.src_path, 'foo/index.md')
  150. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo/index.md')
  151. self.assertPathsEqual(f.dest_path, 'foo/index.html')
  152. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo/index.html')
  153. self.assertEqual(f.url, 'foo/index.html')
  154. self.assertEqual(f.name, 'index')
  155. self.assertTrue(f.is_documentation_page())
  156. self.assertFalse(f.is_static_page())
  157. self.assertFalse(f.is_media_file())
  158. self.assertFalse(f.is_javascript())
  159. self.assertFalse(f.is_css())
  160. def test_md_index_file_nested_use_directory_urls(self):
  161. f = File('foo/index.md', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  162. self.assertPathsEqual(f.src_path, 'foo/index.md')
  163. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo/index.md')
  164. self.assertPathsEqual(f.dest_path, 'foo/index.html')
  165. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo/index.html')
  166. self.assertEqual(f.url, 'foo/')
  167. self.assertEqual(f.name, 'index')
  168. self.assertTrue(f.is_documentation_page())
  169. self.assertFalse(f.is_static_page())
  170. self.assertFalse(f.is_media_file())
  171. self.assertFalse(f.is_javascript())
  172. self.assertFalse(f.is_css())
  173. def test_static_file(self):
  174. f = File('foo/bar.html', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  175. self.assertPathsEqual(f.src_path, 'foo/bar.html')
  176. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo/bar.html')
  177. self.assertPathsEqual(f.dest_path, 'foo/bar.html')
  178. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo/bar.html')
  179. self.assertEqual(f.url, 'foo/bar.html')
  180. self.assertEqual(f.name, 'bar')
  181. self.assertFalse(f.is_documentation_page())
  182. self.assertTrue(f.is_static_page())
  183. self.assertFalse(f.is_media_file())
  184. self.assertFalse(f.is_javascript())
  185. self.assertFalse(f.is_css())
  186. def test_static_file_use_directory_urls(self):
  187. f = File('foo/bar.html', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  188. self.assertPathsEqual(f.src_path, 'foo/bar.html')
  189. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo/bar.html')
  190. self.assertPathsEqual(f.dest_path, 'foo/bar.html')
  191. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo/bar.html')
  192. self.assertEqual(f.url, 'foo/bar.html')
  193. self.assertEqual(f.name, 'bar')
  194. self.assertFalse(f.is_documentation_page())
  195. self.assertTrue(f.is_static_page())
  196. self.assertFalse(f.is_media_file())
  197. self.assertFalse(f.is_javascript())
  198. self.assertFalse(f.is_css())
  199. def test_media_file(self):
  200. f = File('foo/bar.jpg', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  201. self.assertPathsEqual(f.src_path, 'foo/bar.jpg')
  202. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo/bar.jpg')
  203. self.assertPathsEqual(f.dest_path, 'foo/bar.jpg')
  204. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo/bar.jpg')
  205. self.assertEqual(f.url, 'foo/bar.jpg')
  206. self.assertEqual(f.name, 'bar')
  207. self.assertFalse(f.is_documentation_page())
  208. self.assertFalse(f.is_static_page())
  209. self.assertTrue(f.is_media_file())
  210. self.assertFalse(f.is_javascript())
  211. self.assertFalse(f.is_css())
  212. def test_media_file_use_directory_urls(self):
  213. f = File('foo/bar.jpg', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  214. self.assertPathsEqual(f.src_path, 'foo/bar.jpg')
  215. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo/bar.jpg')
  216. self.assertPathsEqual(f.dest_path, 'foo/bar.jpg')
  217. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo/bar.jpg')
  218. self.assertEqual(f.url, 'foo/bar.jpg')
  219. self.assertEqual(f.name, 'bar')
  220. self.assertFalse(f.is_documentation_page())
  221. self.assertFalse(f.is_static_page())
  222. self.assertTrue(f.is_media_file())
  223. self.assertFalse(f.is_javascript())
  224. self.assertFalse(f.is_css())
  225. def test_javascript_file(self):
  226. f = File('foo/bar.js', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  227. self.assertPathsEqual(f.src_path, 'foo/bar.js')
  228. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo/bar.js')
  229. self.assertPathsEqual(f.dest_path, 'foo/bar.js')
  230. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo/bar.js')
  231. self.assertEqual(f.url, 'foo/bar.js')
  232. self.assertEqual(f.name, 'bar')
  233. self.assertFalse(f.is_documentation_page())
  234. self.assertFalse(f.is_static_page())
  235. self.assertTrue(f.is_media_file())
  236. self.assertTrue(f.is_javascript())
  237. self.assertFalse(f.is_css())
  238. def test_javascript_file_use_directory_urls(self):
  239. f = File('foo/bar.js', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  240. self.assertPathsEqual(f.src_path, 'foo/bar.js')
  241. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo/bar.js')
  242. self.assertPathsEqual(f.dest_path, 'foo/bar.js')
  243. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo/bar.js')
  244. self.assertEqual(f.url, 'foo/bar.js')
  245. self.assertEqual(f.name, 'bar')
  246. self.assertFalse(f.is_documentation_page())
  247. self.assertFalse(f.is_static_page())
  248. self.assertTrue(f.is_media_file())
  249. self.assertTrue(f.is_javascript())
  250. self.assertFalse(f.is_css())
  251. def test_css_file(self):
  252. f = File('foo/bar.css', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  253. self.assertPathsEqual(f.src_path, 'foo/bar.css')
  254. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo/bar.css')
  255. self.assertPathsEqual(f.dest_path, 'foo/bar.css')
  256. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo/bar.css')
  257. self.assertEqual(f.url, 'foo/bar.css')
  258. self.assertEqual(f.name, 'bar')
  259. self.assertFalse(f.is_documentation_page())
  260. self.assertFalse(f.is_static_page())
  261. self.assertTrue(f.is_media_file())
  262. self.assertFalse(f.is_javascript())
  263. self.assertTrue(f.is_css())
  264. def test_css_file_use_directory_urls(self):
  265. f = File('foo/bar.css', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  266. self.assertPathsEqual(f.src_path, 'foo/bar.css')
  267. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo/bar.css')
  268. self.assertPathsEqual(f.dest_path, 'foo/bar.css')
  269. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo/bar.css')
  270. self.assertEqual(f.url, 'foo/bar.css')
  271. self.assertEqual(f.name, 'bar')
  272. self.assertFalse(f.is_documentation_page())
  273. self.assertFalse(f.is_static_page())
  274. self.assertTrue(f.is_media_file())
  275. self.assertFalse(f.is_javascript())
  276. self.assertTrue(f.is_css())
  277. def test_file_name_with_space(self):
  278. f = File('foo bar.md', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  279. self.assertPathsEqual(f.src_path, 'foo bar.md')
  280. self.assertPathsEqual(f.abs_src_path, '/path/to/docs/foo bar.md')
  281. self.assertPathsEqual(f.dest_path, 'foo bar.html')
  282. self.assertPathsEqual(f.abs_dest_path, '/path/to/site/foo bar.html')
  283. self.assertEqual(f.url, 'foo%20bar.html')
  284. self.assertEqual(f.name, 'foo bar')
  285. def test_files(self):
  286. fs = [
  287. File('index.md', '/path/to/docs', '/path/to/site', use_directory_urls=True),
  288. File('foo/bar.md', '/path/to/docs', '/path/to/site', use_directory_urls=True),
  289. File('foo/bar.html', '/path/to/docs', '/path/to/site', use_directory_urls=True),
  290. File('foo/bar.jpg', '/path/to/docs', '/path/to/site', use_directory_urls=True),
  291. File('foo/bar.js', '/path/to/docs', '/path/to/site', use_directory_urls=True),
  292. File('foo/bar.css', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  293. ]
  294. files = Files(fs)
  295. self.assertEqual([f for f in files], fs)
  296. self.assertEqual(len(files), 6)
  297. self.assertEqual(files.documentation_pages(), [fs[0], fs[1]])
  298. self.assertEqual(files.static_pages(), [fs[2]])
  299. self.assertEqual(files.media_files(), [fs[3], fs[4], fs[5]])
  300. self.assertEqual(files.javascript_files(), [fs[4]])
  301. self.assertEqual(files.css_files(), [fs[5]])
  302. self.assertEqual(files.get_file_from_path('foo/bar.jpg'), fs[3])
  303. self.assertEqual(files.get_file_from_path('foo/bar.jpg'), fs[3])
  304. self.assertEqual(files.get_file_from_path('missing.jpg'), None)
  305. self.assertTrue(fs[2].src_path in files)
  306. self.assertTrue(fs[2].src_path in files)
  307. extra_file = File('extra.md', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  308. self.assertFalse(extra_file.src_path in files)
  309. files.append(extra_file)
  310. self.assertEqual(len(files), 7)
  311. self.assertTrue(extra_file.src_path in files)
  312. self.assertEqual(files.documentation_pages(), [fs[0], fs[1], extra_file])
  313. @tempdir(files=[
  314. 'favicon.ico',
  315. 'index.md'
  316. ])
  317. @tempdir(files=[
  318. 'base.html',
  319. 'favicon.ico',
  320. 'style.css',
  321. 'foo.md',
  322. 'README',
  323. '.ignore.txt',
  324. '.ignore/file.txt',
  325. 'foo/.ignore.txt',
  326. 'foo/.ignore/file.txt'
  327. ])
  328. def test_add_files_from_theme(self, tdir, ddir):
  329. config = load_config(docs_dir=ddir, theme={'name': None, 'custom_dir': tdir})
  330. env = config['theme'].get_env()
  331. files = get_files(config)
  332. self.assertEqual(
  333. [file.src_path for file in files],
  334. ['index.md', 'favicon.ico']
  335. )
  336. files.add_files_from_theme(env, config)
  337. self.assertEqual(
  338. [file.src_path for file in files],
  339. ['index.md', 'favicon.ico', 'style.css']
  340. )
  341. # Ensure theme file does not override docs_dir file
  342. self.assertEqual(
  343. files.get_file_from_path('favicon.ico').abs_src_path,
  344. os.path.normpath(os.path.join(ddir, 'favicon.ico'))
  345. )
  346. def test_filter_paths(self):
  347. # Root level file
  348. self.assertFalse(_filter_paths('foo.md', 'foo.md', False, ['bar.md']))
  349. self.assertTrue(_filter_paths('foo.md', 'foo.md', False, ['foo.md']))
  350. # Nested file
  351. self.assertFalse(_filter_paths('foo.md', 'baz/foo.md', False, ['bar.md']))
  352. self.assertTrue(_filter_paths('foo.md', 'baz/foo.md', False, ['foo.md']))
  353. # Wildcard
  354. self.assertFalse(_filter_paths('foo.md', 'foo.md', False, ['*.txt']))
  355. self.assertTrue(_filter_paths('foo.md', 'foo.md', False, ['*.md']))
  356. # Root level dir
  357. self.assertFalse(_filter_paths('bar', 'bar', True, ['/baz']))
  358. self.assertFalse(_filter_paths('bar', 'bar', True, ['/baz/']))
  359. self.assertTrue(_filter_paths('bar', 'bar', True, ['/bar']))
  360. self.assertTrue(_filter_paths('bar', 'bar', True, ['/bar/']))
  361. # Nested dir
  362. self.assertFalse(_filter_paths('bar', 'foo/bar', True, ['/bar']))
  363. self.assertFalse(_filter_paths('bar', 'foo/bar', True, ['/bar/']))
  364. self.assertTrue(_filter_paths('bar', 'foo/bar', True, ['bar/']))
  365. # Files that look like dirs (no extension). Note that `is_dir` is `False`.
  366. self.assertFalse(_filter_paths('bar', 'bar', False, ['bar/']))
  367. self.assertFalse(_filter_paths('bar', 'foo/bar', False, ['bar/']))
  368. def test_get_relative_url_use_directory_urls(self):
  369. to_files = [
  370. 'index.md',
  371. 'foo/index.md',
  372. 'foo/bar/index.md',
  373. 'foo/bar/baz/index.md',
  374. 'foo.md',
  375. 'foo/bar.md',
  376. 'foo/bar/baz.md'
  377. ]
  378. to_file_urls = [
  379. '.',
  380. 'foo/',
  381. 'foo/bar/',
  382. 'foo/bar/baz/',
  383. 'foo/',
  384. 'foo/bar/',
  385. 'foo/bar/baz/'
  386. ]
  387. from_file = File('img.jpg', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  388. expected = [
  389. 'img.jpg', # img.jpg relative to .
  390. '../img.jpg', # img.jpg relative to foo/
  391. '../../img.jpg', # img.jpg relative to foo/bar/
  392. '../../../img.jpg', # img.jpg relative to foo/bar/baz/
  393. '../img.jpg', # img.jpg relative to foo
  394. '../../img.jpg', # img.jpg relative to foo/bar
  395. '../../../img.jpg' # img.jpg relative to foo/bar/baz
  396. ]
  397. for i, filename in enumerate(to_files):
  398. file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=True)
  399. self.assertEqual(from_file.url, 'img.jpg')
  400. self.assertEqual(file.url, to_file_urls[i])
  401. self.assertEqual(from_file.url_relative_to(file.url), expected[i])
  402. self.assertEqual(from_file.url_relative_to(file), expected[i])
  403. from_file = File('foo/img.jpg', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  404. expected = [
  405. 'foo/img.jpg', # foo/img.jpg relative to .
  406. 'img.jpg', # foo/img.jpg relative to foo/
  407. '../img.jpg', # foo/img.jpg relative to foo/bar/
  408. '../../img.jpg', # foo/img.jpg relative to foo/bar/baz/
  409. 'img.jpg', # foo/img.jpg relative to foo
  410. '../img.jpg', # foo/img.jpg relative to foo/bar
  411. '../../img.jpg' # foo/img.jpg relative to foo/bar/baz
  412. ]
  413. for i, filename in enumerate(to_files):
  414. file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=True)
  415. self.assertEqual(from_file.url, 'foo/img.jpg')
  416. self.assertEqual(file.url, to_file_urls[i])
  417. self.assertEqual(from_file.url_relative_to(file.url), expected[i])
  418. self.assertEqual(from_file.url_relative_to(file), expected[i])
  419. from_file = File('index.html', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  420. expected = [
  421. '.', # . relative to .
  422. '..', # . relative to foo/
  423. '../..', # . relative to foo/bar/
  424. '../../..', # . relative to foo/bar/baz/
  425. '..', # . relative to foo
  426. '../..', # . relative to foo/bar
  427. '../../..' # . relative to foo/bar/baz
  428. ]
  429. for i, filename in enumerate(to_files):
  430. file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=True)
  431. self.assertEqual(from_file.url, '.')
  432. self.assertEqual(file.url, to_file_urls[i])
  433. self.assertEqual(from_file.url_relative_to(file.url), expected[i])
  434. self.assertEqual(from_file.url_relative_to(file), expected[i])
  435. from_file = File('file.md', '/path/to/docs', '/path/to/site', use_directory_urls=True)
  436. expected = [
  437. 'file/', # file relative to .
  438. '../file/', # file relative to foo/
  439. '../../file/', # file relative to foo/bar/
  440. '../../../file/', # file relative to foo/bar/baz/
  441. '../file/', # file relative to foo
  442. '../../file/', # file relative to foo/bar
  443. '../../../file/' # file relative to foo/bar/baz
  444. ]
  445. for i, filename in enumerate(to_files):
  446. file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=True)
  447. self.assertEqual(from_file.url, 'file/')
  448. self.assertEqual(file.url, to_file_urls[i])
  449. self.assertEqual(from_file.url_relative_to(file.url), expected[i])
  450. self.assertEqual(from_file.url_relative_to(file), expected[i])
  451. def test_get_relative_url(self):
  452. to_files = [
  453. 'index.md',
  454. 'foo/index.md',
  455. 'foo/bar/index.md',
  456. 'foo/bar/baz/index.md',
  457. 'foo.md',
  458. 'foo/bar.md',
  459. 'foo/bar/baz.md'
  460. ]
  461. to_file_urls = [
  462. 'index.html',
  463. 'foo/index.html',
  464. 'foo/bar/index.html',
  465. 'foo/bar/baz/index.html',
  466. 'foo.html',
  467. 'foo/bar.html',
  468. 'foo/bar/baz.html'
  469. ]
  470. from_file = File('img.jpg', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  471. expected = [
  472. 'img.jpg', # img.jpg relative to .
  473. '../img.jpg', # img.jpg relative to foo/
  474. '../../img.jpg', # img.jpg relative to foo/bar/
  475. '../../../img.jpg', # img.jpg relative to foo/bar/baz/
  476. 'img.jpg', # img.jpg relative to foo.html
  477. '../img.jpg', # img.jpg relative to foo/bar.html
  478. '../../img.jpg' # img.jpg relative to foo/bar/baz.html
  479. ]
  480. for i, filename in enumerate(to_files):
  481. file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=False)
  482. self.assertEqual(from_file.url, 'img.jpg')
  483. self.assertEqual(file.url, to_file_urls[i])
  484. self.assertEqual(from_file.url_relative_to(file.url), expected[i])
  485. self.assertEqual(from_file.url_relative_to(file), expected[i])
  486. from_file = File('foo/img.jpg', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  487. expected = [
  488. 'foo/img.jpg', # foo/img.jpg relative to .
  489. 'img.jpg', # foo/img.jpg relative to foo/
  490. '../img.jpg', # foo/img.jpg relative to foo/bar/
  491. '../../img.jpg', # foo/img.jpg relative to foo/bar/baz/
  492. 'foo/img.jpg', # foo/img.jpg relative to foo.html
  493. 'img.jpg', # foo/img.jpg relative to foo/bar.html
  494. '../img.jpg' # foo/img.jpg relative to foo/bar/baz.html
  495. ]
  496. for i, filename in enumerate(to_files):
  497. file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=False)
  498. self.assertEqual(from_file.url, 'foo/img.jpg')
  499. self.assertEqual(file.url, to_file_urls[i])
  500. self.assertEqual(from_file.url_relative_to(file.url), expected[i])
  501. self.assertEqual(from_file.url_relative_to(file), expected[i])
  502. from_file = File('index.html', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  503. expected = [
  504. 'index.html', # index.html relative to .
  505. '../index.html', # index.html relative to foo/
  506. '../../index.html', # index.html relative to foo/bar/
  507. '../../../index.html', # index.html relative to foo/bar/baz/
  508. 'index.html', # index.html relative to foo.html
  509. '../index.html', # index.html relative to foo/bar.html
  510. '../../index.html' # index.html relative to foo/bar/baz.html
  511. ]
  512. for i, filename in enumerate(to_files):
  513. file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=False)
  514. self.assertEqual(from_file.url, 'index.html')
  515. self.assertEqual(file.url, to_file_urls[i])
  516. self.assertEqual(from_file.url_relative_to(file.url), expected[i])
  517. self.assertEqual(from_file.url_relative_to(file), expected[i])
  518. from_file = File('file.html', '/path/to/docs', '/path/to/site', use_directory_urls=False)
  519. expected = [
  520. 'file.html', # file.html relative to .
  521. '../file.html', # file.html relative to foo/
  522. '../../file.html', # file.html relative to foo/bar/
  523. '../../../file.html', # file.html relative to foo/bar/baz/
  524. 'file.html', # file.html relative to foo.html
  525. '../file.html', # file.html relative to foo/bar.html
  526. '../../file.html' # file.html relative to foo/bar/baz.html
  527. ]
  528. for i, filename in enumerate(to_files):
  529. file = File(filename, '/path/to/docs', '/path/to/site', use_directory_urls=False)
  530. self.assertEqual(from_file.url, 'file.html')
  531. self.assertEqual(file.url, to_file_urls[i])
  532. self.assertEqual(from_file.url_relative_to(file.url), expected[i])
  533. self.assertEqual(from_file.url_relative_to(file), expected[i])
  534. @tempdir(files=[
  535. 'index.md',
  536. 'bar.css',
  537. 'bar.html',
  538. 'bar.jpg',
  539. 'bar.js',
  540. 'bar.md',
  541. '.dotfile',
  542. 'templates/foo.html'
  543. ])
  544. def test_get_files(self, tdir):
  545. config = load_config(docs_dir=tdir, extra_css=['bar.css'], extra_javascript=['bar.js'])
  546. files = get_files(config)
  547. expected = ['index.md', 'bar.css', 'bar.html', 'bar.jpg', 'bar.js', 'bar.md']
  548. self.assertIsInstance(files, Files)
  549. self.assertEqual(len(files), len(expected))
  550. self.assertEqual([f.src_path for f in files], expected)
  551. @tempdir(files=[
  552. 'README.md',
  553. 'foo.md'
  554. ])
  555. def test_get_files_include_readme_without_index(self, tdir):
  556. config = load_config(docs_dir=tdir)
  557. files = get_files(config)
  558. expected = ['README.md', 'foo.md']
  559. self.assertIsInstance(files, Files)
  560. self.assertEqual(len(files), len(expected))
  561. self.assertEqual([f.src_path for f in files], expected)
  562. @tempdir(files=[
  563. 'index.md',
  564. 'README.md',
  565. 'foo.md'
  566. ])
  567. def test_get_files_exclude_readme_with_index(self, tdir):
  568. config = load_config(docs_dir=tdir)
  569. files = get_files(config)
  570. expected = ['index.md', 'foo.md']
  571. self.assertIsInstance(files, Files)
  572. self.assertEqual(len(files), len(expected))
  573. self.assertEqual([f.src_path for f in files], expected)
  574. @tempdir()
  575. @tempdir(files={'test.txt': 'source content'})
  576. def test_copy_file(self, src_dir, dest_dir):
  577. file = File('test.txt', src_dir, dest_dir, use_directory_urls=False)
  578. dest_path = os.path.join(dest_dir, 'test.txt')
  579. self.assertPathNotExists(dest_path)
  580. file.copy_file()
  581. self.assertPathIsFile(dest_path)
  582. @tempdir(files={'test.txt': 'destination content'})
  583. @tempdir(files={'test.txt': 'source content'})
  584. def test_copy_file_clean_modified(self, src_dir, dest_dir):
  585. file = File('test.txt', src_dir, dest_dir, use_directory_urls=False)
  586. file.is_modified = mock.Mock(return_value=True)
  587. dest_path = os.path.join(dest_dir, 'test.txt')
  588. file.copy_file(dirty=False)
  589. self.assertPathIsFile(dest_path)
  590. with open(dest_path, 'r', encoding='utf-8') as f:
  591. self.assertEqual(f.read(), 'source content')
  592. @tempdir(files={'test.txt': 'destination content'})
  593. @tempdir(files={'test.txt': 'source content'})
  594. def test_copy_file_dirty_modified(self, src_dir, dest_dir):
  595. file = File('test.txt', src_dir, dest_dir, use_directory_urls=False)
  596. file.is_modified = mock.Mock(return_value=True)
  597. dest_path = os.path.join(dest_dir, 'test.txt')
  598. file.copy_file(dirty=True)
  599. self.assertPathIsFile(dest_path)
  600. with open(dest_path, 'r', encoding='utf-8') as f:
  601. self.assertEqual(f.read(), 'source content')
  602. @tempdir(files={'test.txt': 'destination content'})
  603. @tempdir(files={'test.txt': 'source content'})
  604. def test_copy_file_dirty_not_modified(self, src_dir, dest_dir):
  605. file = File('test.txt', src_dir, dest_dir, use_directory_urls=False)
  606. file.is_modified = mock.Mock(return_value=False)
  607. dest_path = os.path.join(dest_dir, 'test.txt')
  608. file.copy_file(dirty=True)
  609. self.assertPathIsFile(dest_path)
  610. with open(dest_path, 'r', encoding='utf-8') as f:
  611. self.assertEqual(f.read(), 'destination content')