def test_simple_assets(tmpworkdir): mktree(tmpworkdir, { 'test.js': 'var hello = 1;', 'deep/static/path': { 'styles.css': 'body {color: green}', }, 'harrier.yml': """\ root: . assets: active: True""" }) config = Config('harrier.yml') config.setup() build(config) assert gettree(tmpworkdir.join('build')) == { 'test.js': 'var hello = 1;', 'deep': {'static': {'path': {'styles.css': 'body {color: green}'}}}, 'assets.json': """\ { "commit": "unknown", "files": { "deep/static/path/styles.css": "/deep/static/path/styles.css", "test.js": "/test.js" } } """, }
def test_subdirectory_bad(tmpworkdir): tmpworkdir.join('test.js').write('X') tmpworkdir.join('harrier.yml').write("""\ subdirectory: /apples""") config = Config('harrier.yml') with pytest.raises(HarrierProblem): config.setup()
def test_jinja_static_missing(tmpworkdir): tmpworkdir.join('index.html').write("{{ 'foo.txt'|S }}") config = Config() config.setup() with pytest.raises(HarrierProblem): build(config) assert gettree(tmpworkdir) == {'index.html': "{{ 'foo.txt'|S }}", 'build': {}}
def test_git_commit(tmpworkdir): mktree(tmpworkdir, { 'test.js': 'X', 'harrier.yml': """\ root: . assets: active: True""" }) with patch('harrier.tools.subprocess.run') as mock_run: mock_run.return_value = CompletedProcess(args=[], returncode=0, stdout=b'commit sha1\n') config = Config('harrier.yml') config.setup() build(config) assert gettree(tmpworkdir.join('build')) == { 'test.js': 'X', 'assets.json': """\ { "commit": "commit sha1", "files": { "test.js": "/test.js" } } """, } assert mock_run.called
def test_execute_different_dir(tmpworkdir): mktree(tmpworkdir, { 'path/different_root': { 'foo': 'C_foo', 'lib/test.js': 'C_test.js', }, 'harrier.yml': """\ root: path/different_root execute: commands: - command: 'cp {ROOT}/lib/test.js {ROOT}/foobar.js' generates: ['foobar.js'] patterns: - ./lib/*""" }) config = Config() config.setup() build(config) assert gettree(tmpworkdir.join('build')) == {'foo': 'C_foo', 'foobar.js': 'C_test.js'} assert gettree(tmpworkdir.join('path').join('different_root')) == { 'foo': 'C_foo', 'lib': { 'test.js': 'C_test.js', } }
def test_jinja_static(tmpworkdir): tmpworkdir.join('foo.txt').write('hello') tmpworkdir.join('index.html').write("{{ 'foo.txt'|S }}") config = Config() config.setup() build(config) assert gettree(tmpworkdir.join('build')) == {'index.html': 'foo.txt', 'foo.txt': 'hello'}
def test_sass_precision_5(tmpworkdir): mktree(tmpworkdir, {'styles.scss': 'a { width: (100 / 6)px}'}) config = Config(config_dict={'sass': {'precision': 5}}) config.setup() build(config) assert gettree(tmpworkdir.join('build')) == { 'styles.css': 'a {\n width: 16.66667 px; }\n' }
def test_build_sass(tmpworkdir): mktree(tmpworkdir, {'styles.sass': 'a\n b\n color: blue;'}) config = Config() config.setup() build(config) assert gettree(tmpworkdir.join('build')) == { 'styles.css': 'a b {\n color: blue; }\n' }
def test_json_seperate_root(tmpworkdir): root_dir = tmpworkdir.mkdir('foobar') tmpworkdir.join('harrier.json').write('{"root": "foobar"}') root_dir.join('bar').write('hello') config = Config('harrier.json') config.setup() build(config) assert gettree(tmpworkdir.join('build')) == {'bar': 'hello'}
def test_subdirectory(tmpworkdir): tmpworkdir.join('test.js').write('X') tmpworkdir.join('harrier.yml').write("""\ subdirectory: apples""") config = Config('harrier.yml') config.setup() build(config) assert gettree(tmpworkdir.join('build')) == {'apples': {'test.js': 'X'}}
def test_jinja_static_library_missing(tmpworkdir): tmpworkdir.join('index.html').write("{{ 'lib_file.js'|S('libs/lib_file.js') }}") config = Config() config.setup() with pytest.raises(HarrierProblem): build(config) assert gettree(tmpworkdir) == {'index.html': "{{ 'lib_file.js'|S('libs/lib_file.js') }}", 'build': {}}
def test_jinja_static_abs_url(tmpworkdir): tmpworkdir.mkdir('path') tmpworkdir.join('foo.txt').write('hello') tmpworkdir.join('path', 'index.html').write("{{ '/foo.txt'|S }}") config = Config() config.setup() build(config) assert gettree(tmpworkdir.join('build')) == {'path': {'index.html': '/foo.txt'}, 'foo.txt': 'hello'}
def test_jinja_live(tmpworkdir): tmpworkdir.join('index.html').write('{{ 42 + 5 }}') config = Config() config.setup('build', True) build(config) assert gettree(tmpworkdir.join('build')) == { 'index.html': '47\n<script src="http://localhost:8000/livereload.js"></script>\n', }
def test_build_scss_bad(tmpworkdir, logcap): logcap.set_level(logging.ERROR) mktree(tmpworkdir, {'styles.scss': 'x = 42'}) config = Config() config.setup() with pytest.raises(HarrierProblem) as excinfo: build(config) assert excinfo.value.args[0] == 'Error compiling SASS' assert logcap.log == """Error: Invalid CSS after "x": expected "{", was "= 42"
def test_bad_config_base_dir(tmpworkdir): tmpworkdir.join('harrier.yml').write('root: whatever') config = Config() with pytest.raises(HarrierProblem) as excinfo: config.setup() assert excinfo.value.args[0] == 'config root "whatever" does not exist relative to config file directory "."' with pytest.raises(HarrierProblem) as excinfo: config.setup(base_dir='basedir') assert excinfo.value.args[0] == 'config root "whatever" does not exist relative to directory "basedir"'
def simpleharrier(tmpworkdir): js = tmpworkdir.join("test.js") js.write("var hello = 1;") _config = Config() _config.setup() class Tmp: tmpdir = tmpworkdir config = _config return Tmp
def test_simple_build(tmpworkdir): tmpworkdir.join('test.js').write('var hello = 1;') tmpworkdir.join('harrier.yml').write("""\ root: . target: build: path: build""") config = Config('harrier.yml') config.setup() build(config) assert gettree(tmpworkdir.join('build')) == {'test.js': 'var hello = 1;'}
def test_jinja_static_library(tmpworkdir, library): # here the library directory is inside the config root, shouldn't make any difference mktree(tmpworkdir, { 'bower_components/package/path/lib_file.js': 'lib content', 'index.html': "{{ 'lib_file.js'|S('%s') }}" % library }) config = Config() config.setup() build(config) assert gettree(tmpworkdir.join('build')) == {'index.html': 'lib_file.js', 'lib_file.js': 'lib content'}
def test_execute_not_found(tmpworkdir): tmpworkdir.mkdir('lib').join('test.js').write('XX') tmpworkdir.join('harrier.yml').write("""\ execute: commands: ['cp missing.js foobar.js'] patterns: - ./lib/*.js""") config = Config() config.setup() with pytest.raises(HarrierProblem) as excinfo: build(config) assert excinfo.value.args[0] == 'command "cp missing.js foobar.js" returned non-zero exit status 1'
def test_execute_bad_command(tmpworkdir, logcap): tmpworkdir.mkdir('lib').join('test.js').write('XX') tmpworkdir.join('harrier.yml').write("""\ execute: commands: ['foobar'] patterns: - ./lib/*.js""") config = Config() config.setup() with pytest.raises(HarrierProblem) as excinfo: build(config) assert excinfo.value.args[0] == 'problem executing "foobar"' assert logcap.log == "FileNotFoundError: [Errno 2] No such file or directory: 'foobar'\n"
def test_execute(tmpworkdir): tmpworkdir.mkdir('lib').join('test.js').write('XX') tmpworkdir.join('harrier.yml').write("""\ execute: commands: - command: 'cp lib/test.js foobar.js' generates: ['foobar.js'] patterns: - ./lib/*.js""") config = Config() config.setup() build(config) assert gettree(tmpworkdir.join('build')) == {'foobar.js': 'XX'} assert tmpworkdir.join('foobar.js').check() is False
def test_execute_generate_missing(tmpworkdir): tmpworkdir.mkdir('lib').join('test.js').write('XX') tmpworkdir.join('harrier.yml').write("""\ execute: commands: - command: 'cp lib/test.js foobar.js' generates: ['missing.js'] patterns: - ./lib/*.js""") config = Config() config.setup() with pytest.raises(HarrierProblem) as excinfo: build(config) assert excinfo.value.args[0] == 'command "cp lib/test.js foobar.js" failed to generate missing.js'
def test_sass_exclude(tmpworkdir): mktree(tmpworkdir, { 'src': { '_foo.scss': '$primary-colour: #016997;', 'bar.scss': """\ @import 'foo'; body { color: $primary-colour; }""" }, 'harrier.yml': '\nroot: src' }) config = Config() config.setup() build(config) assert gettree(tmpworkdir.join('build')) == {'bar.css': 'body {\n color: #016997; }\n'}
def test_simple_frontmatter(tmpworkdir): mktree(tmpworkdir, { 'src': { 'foo.html': """\ --- test_var: "carrot cake" --- I would like some {{ test_var }}.""", }, 'harrier.yml': '\nroot: src' }) config = Config() config.setup() build(config) assert gettree(tmpworkdir.join('build')) == { 'foo.html': 'I would like some carrot cake.', }
def test_build_simple_som(tmpdir): mktree( tmpdir, { 'dist/theme/assets/whatever.1234567.png': '**', 'pages': { 'foobar.md': '# hello\n\nthis is a test foo: {{ foo }}', 'posts/2032-06-01-testing.html': '# testing', 'static/image.png': '*', }, 'theme/templates/main.jinja': 'main, content:\n\n {{ content }}', }) config = Config(source_dir=str(tmpdir), tmp_dir=str(tmpdir.join('tmp')), foo='bar', defaults={'/posts/*': { 'uri': '/foobar/{slug}.html' }}) pages = build_pages(config) content_templates(pages.values(), config) source_dir = Path(tmpdir) # debug(som) assert { '/foobar.md': { 'infile': source_dir / 'pages/foobar.md', 'content_template': 'content/foobar.md', 'title': 'Foobar', 'slug': 'foobar', 'created': CloseToNow(), 'uri': '/foobar/', 'template': None, 'content': ('# hello\n' '\n' 'this is a test foo: {{ foo }}'), 'pass_through': False, }, '/posts/2032-06-01-testing.html': { 'infile': source_dir / 'pages/posts/2032-06-01-testing.html', 'content_template': 'content/posts/2032-06-01-testing.html', 'title': 'Testing', 'slug': 'testing', 'created': datetime(2032, 6, 1, 0, 0), 'uri': '/foobar/testing.html', 'template': None, 'content': '# testing', 'pass_through': False, }, '/static/image.png': { 'infile': source_dir / 'pages/static/image.png', 'title': 'image.png', 'slug': 'image.png', 'created': CloseToNow(), 'uri': '/static/image.png', 'pass_through': True, } } == pages
def test_simple_render(tmpdir): foo_page = '# hello\n\nthis is a test foo: {{ foo }}' mktree( tmpdir, { 'pages': { 'foobar.md': foo_page, 'spam.html': '# SPAM', 'favicon.ico': '*', }, 'theme/templates/main.jinja': 'main, content:\n\n{{ content }}', 'tmp/content/foobar.md': foo_page, }) config = Config( source_dir=str(tmpdir), tmp_dir=str(tmpdir.join('tmp')), foo='bar', ) som = { 'pages': { 'foobar.md': { 'uri': '/foobar.html', 'infile': config.pages_dir / 'foobar.md', 'template': 'main.jinja', 'content_template': Path('content') / 'foobar.md', }, 'favicon.ico': { 'uri': '/favicon.ico', 'infile': config.pages_dir / 'favicon.ico', }, } } expected_tree = { 'foobar.html': ('main, content:\n\n' '<h1 id="1-hello">hello</h1>\n\n' '<p>this is a test foo: </p>\n'), 'favicon.ico': '*', } assert not tmpdir.join('dist').check() assert render_pages(config, som) is None assert gettree(tmpdir.join('dist')) == expected_tree tmpdir.join('dist').remove(rec=1) assert not tmpdir.join('dist').check() cache = render_pages(config, som, {}) assert gettree(tmpdir.join('dist')) == expected_tree assert len(cache) == 2 tmpdir.join('dist').remove(rec=1) assert not tmpdir.join('dist').check() render_pages(config, som, cache) assert gettree(tmpdir.join('dist')) != expected_tree
def test_extends_build(tmpworkdir): mktree(tmpworkdir, { 'src': { 'foo.html': 'start\n{% block hello %}{% endblock %}', 'bar.html': """ {% extends 'foo.html' %} {% block hello %} body {% endblock %}""", }, 'harrier.yml': '\nroot: src' }) config = Config() config.setup() build(config) assert gettree(tmpworkdir.join('build')) == { 'foo.html': 'start\n', 'bar.html': '\nstart\n\nbody\n', }
def test_yaml(tmpworkdir): mktree(tmpworkdir, { 'test.js': 'var hello = 1;', 'harrier.yml': """\ root: . assets: file: assets.yaml active: True""" }) config = Config('harrier.yml') config.setup() build(config) assert gettree(tmpworkdir.join('build')) == { 'test.js': 'var hello = 1;', 'assets.yaml': """\ commit: unknown files: test.js: /test.js """, }
def test_harrier_watcher(tmpdir): mktree(tmpdir, { 'pages/foobar.md': '# hello', 'theme/templates/main.jinja': 'main:\n {{ content }}', }) harrier.dev.CONFIG = Config(source_dir=tmpdir) watcher = HarrierWatcher(Path(tmpdir)) assert not watcher.should_watch_dir(Entry(tmpdir.join('foobar'))) assert not watcher.should_watch_dir(Entry(tmpdir.join('__pycache__'))) assert watcher.should_watch_dir(Entry(tmpdir.join('pages'))) assert watcher.should_watch_dir(Entry(tmpdir.join('pages/whatever'))) harrier.dev.CONFIG = None
def test_extends_exclude_build(tmpworkdir): mktree(tmpworkdir, { 'bower_components/package/path/lib_file.js': 'lib content', 'src': { '_foo.html': """\ {{ 'lib_file.js'|S('lib_file.js') }} start {% block hello %}{% endblock %}""", 'bar.html': """\ {% extends '_foo.html' %} {% block hello %} body {% endblock %}""", }, 'harrier.yml': '\nroot: src' }) config = Config() config.setup() build(config) assert gettree(tmpworkdir.join('build')) == { 'bar.html': 'lib_file.js\nstart\n\nbody\n', 'lib_file.js': 'lib content' }
def test_assets_blank_subdirectory(tmpworkdir): mktree(tmpworkdir, { 'test.js': 'var hello = 1;', 'harrier.yml': """\ root: . subdirectory: my_static assets: active: True""" }) config = Config('harrier.yml') config.setup() build(config) assert gettree(tmpworkdir.join('build')) == { 'my_static': { 'test.js': 'var hello = 1;', 'assets.json': """\ { "commit": "unknown", "files": { "test.js": "/my_static/test.js" } } """}}
def test_url_root(tmpworkdir): mktree(tmpworkdir, { 'test.js': 'var hello = 1;', 'harrier.yml': """\ root: . assets: url_root: http://www.example.com active: True""" }) config = Config('harrier.yml') config.setup() build(config) assert gettree(tmpworkdir.join('build')) == { 'test.js': 'var hello = 1;', 'assets.json': """\ { "commit": "unknown", "files": { "test.js": "http://www.example.com/test.js" } } """, }
def test_url_root_full_path_subdirectory(tmpworkdir): mktree(tmpworkdir, { 'test.js': 'var hello = 1;', 'harrier.yml': """\ root: . subdirectory: my_static assets: active: True url_root: https://www.foobar.com/whatever""" }) config = Config('harrier.yml') config.setup() build(config) assert gettree(tmpworkdir.join('build')) == { 'my_static': { 'test.js': 'var hello = 1;', 'assets.json': """\ { "commit": "unknown", "files": { "test.js": "https://www.foobar.com/whatever/test.js" } } """}}
def test_placeholders_error(tmpdir): mktree(tmpdir, { 'pages': { 'posts/2032-06-01-testing.html': '# testing', }, }) config = Config( source_dir=str(tmpdir), tmp_dir=str(tmpdir.join('tmp')), foo='bar', defaults={'/posts/*': { 'testing': '{{ title }}-{{ foobar }}', }}) with pytest.raises(HarrierProblem): build_pages(config)
def test_build_default_placeholders(tmpdir): mktree(tmpdir, { 'pages': { 'posts/2032-06-01-testing.html': '# testing', }, }) config = Config(source_dir=str(tmpdir), tmp_dir=str(tmpdir.join('tmp')), foo='bar', defaults={ '/posts/*': { 'uri': '/foobar/{slug}.html', 'test_attr': 'Brain J', 'str_attr': '{{ title }}-{{ test_attr }}', 'dict_attrs': { 'd_attr': '{{ test_attr }}', 'd_foo': 'foo', }, 'list_attrs': ['foo', 'bar', '{{ title }}'], 'list_of_dicts_attr': [{ 'a_key': '{{ title }}-{{ test_attr }}', 'b_key': 'foo bar', }] } }) pages = build_pages(config) content_templates(pages.values(), config) source_dir = Path(tmpdir) assert { '/posts/2032-06-01-testing.html': { 'infile': source_dir / 'pages/posts/2032-06-01-testing.html', 'content_template': 'content/posts/2032-06-01-testing.html', 'title': 'Testing', 'slug': 'testing', 'created': datetime(2032, 6, 1, 0, 0), 'uri': '/foobar/testing.html', 'str_attr': 'Testing-Brain J', 'test_attr': 'Brain J', 'dict_attrs': { 'd_attr': 'Brain J', 'd_foo': 'foo' }, 'list_attrs': ['foo', 'bar', 'Testing'], 'list_of_dicts_attr': [{ 'a_key': 'Testing-Brain J', 'b_key': 'foo bar', }], 'template': None, 'content': '# testing', 'pass_through': False, }, } == pages