1""" 2 test_util_fileutil 3 ~~~~~~~~~~~~~~~~~~ 4 5 Tests sphinx.util.fileutil functions. 6 7 :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. 8 :license: BSD, see LICENSE for details. 9""" 10 11from unittest import mock 12 13from sphinx.jinja2glue import BuiltinTemplateLoader 14from sphinx.util.fileutil import copy_asset, copy_asset_file 15 16 17class DummyTemplateLoader(BuiltinTemplateLoader): 18 def __init__(self): 19 super().__init__() 20 builder = mock.Mock() 21 builder.config.templates_path = [] 22 builder.app.translater = None 23 self.init(builder) 24 25 26def test_copy_asset_file(tempdir): 27 renderer = DummyTemplateLoader() 28 29 # copy normal file 30 src = (tempdir / 'asset.txt') 31 src.write_text('# test data') 32 dest = (tempdir / 'output.txt') 33 34 copy_asset_file(src, dest) 35 assert dest.exists() 36 assert src.read_text() == dest.read_text() 37 38 # copy template file 39 src = (tempdir / 'asset.txt_t') 40 src.write_text('# {{var1}} data') 41 dest = (tempdir / 'output.txt_t') 42 43 copy_asset_file(src, dest, {'var1': 'template'}, renderer) 44 assert not dest.exists() 45 assert (tempdir / 'output.txt').exists() 46 assert (tempdir / 'output.txt').read_text() == '# template data' 47 48 # copy template file to subdir 49 src = (tempdir / 'asset.txt_t') 50 src.write_text('# {{var1}} data') 51 subdir1 = (tempdir / 'subdir') 52 subdir1.makedirs() 53 54 copy_asset_file(src, subdir1, {'var1': 'template'}, renderer) 55 assert (subdir1 / 'asset.txt').exists() 56 assert (subdir1 / 'asset.txt').read_text() == '# template data' 57 58 # copy template file without context 59 src = (tempdir / 'asset.txt_t') 60 subdir2 = (tempdir / 'subdir2') 61 subdir2.makedirs() 62 63 copy_asset_file(src, subdir2) 64 assert not (subdir2 / 'asset.txt').exists() 65 assert (subdir2 / 'asset.txt_t').exists() 66 assert (subdir2 / 'asset.txt_t').read_text() == '# {{var1}} data' 67 68 69def test_copy_asset(tempdir): 70 renderer = DummyTemplateLoader() 71 72 # prepare source files 73 source = (tempdir / 'source') 74 source.makedirs() 75 (source / 'index.rst').write_text('index.rst') 76 (source / 'foo.rst_t').write_text('{{var1}}.rst') 77 (source / '_static').makedirs() 78 (source / '_static' / 'basic.css').write_text('basic.css') 79 (source / '_templates').makedirs() 80 (source / '_templates' / 'layout.html').write_text('layout.html') 81 (source / '_templates' / 'sidebar.html_t').write_text('sidebar: {{var2}}') 82 83 # copy a single file 84 assert not (tempdir / 'test1').exists() 85 copy_asset(source / 'index.rst', tempdir / 'test1') 86 assert (tempdir / 'test1').exists() 87 assert (tempdir / 'test1/index.rst').exists() 88 89 # copy directories 90 destdir = tempdir / 'test2' 91 copy_asset(source, destdir, context=dict(var1='bar', var2='baz'), renderer=renderer) 92 assert (destdir / 'index.rst').exists() 93 assert (destdir / 'foo.rst').exists() 94 assert (destdir / 'foo.rst').read_text() == 'bar.rst' 95 assert (destdir / '_static' / 'basic.css').exists() 96 assert (destdir / '_templates' / 'layout.html').exists() 97 assert (destdir / '_templates' / 'sidebar.html').exists() 98 assert (destdir / '_templates' / 'sidebar.html').read_text() == 'sidebar: baz' 99 100 # copy with exclusion 101 def excluded(path): 102 return ('sidebar.html' in path or 'basic.css' in path) 103 104 destdir = tempdir / 'test3' 105 copy_asset(source, destdir, excluded, 106 context=dict(var1='bar', var2='baz'), renderer=renderer) 107 assert (destdir / 'index.rst').exists() 108 assert (destdir / 'foo.rst').exists() 109 assert not (destdir / '_static' / 'basic.css').exists() 110 assert (destdir / '_templates' / 'layout.html').exists() 111 assert not (destdir / '_templates' / 'sidebar.html').exists() 112