def test_globals(): gg = {'who': 'E.T.', 'action': 'phone', 'where': 'home'} render = Render(globals=gg) tmpl = '{{ who }} {{ action }} {{ where }}' resp = render.from_string(tmpl, to_string=True) assert resp == 'E.T. phone home'
def test_render(): render = Render(views_dir) resp = render.to_string('view.html') assert resp == '<h1>Hello World</h1>' resp = render.to_string('view.txt', who='E.T.', action='phone', where='home') assert resp == 'E.T. phone home'
def test_tests(): def gt_3(val): return val > 3 tt = {'gt_3': gt_3} render = Render(tests=tt) tmpl = '{% if 6 is gt_3 %}ok{% endif %}{% if 1 is gt_3 %} FAIL{% endif %}' resp = render.from_string(tmpl) assert resp == 'ok'
def test_from_string(): render = Render() resp = render.from_string( 'Testing, {{ a }} {{ b }} {{ c }}...', {'a': 1, 'b': '2', 'c': '3'}, to_string=True ) assert resp == 'Testing, 1 2 3...'
def test_filters(): def double(val): return val * 2 def cut(text): return text[:3] ff = {'double': double, 'cut': cut} render = Render(filters=ff) tmpl = '{{ 45|double }} {{ "abcytfugj"|cut }}' resp = render.from_string(tmpl) assert resp == '90 abc'
def test_set_get_tests(): def gt_3(val): return val > 3 render = Render() render.set_test('gt_3', gt_3) tmpl = '{% if 6 is gt_3 %}ok{% endif %}{% if 1 is gt_3 %} FAIL{% endif %}' resp = render.from_string(tmpl) assert resp == 'ok' assert render.get_test('gt_3') == gt_3
def test_i18n(): render = Render(i18n=views_dir) def ok(request): return render.from_string('{{ i18n.HELLO }}') def fail(request): return render.from_string('{{ i18n.FOOBAR }}') urls = [ Rule('/ok/', ok), Rule('/fail/', fail), ] app = Shake(urls) c = app.test_client() resp = c.get('/ok/?lang=en-US') assert resp.status_code == HTTP_OK assert resp.data == 'Hello World' resp = c.get('/ok/?lang=en_US') assert resp.status_code == HTTP_OK assert resp.data == 'Hello World' resp = c.get('/ok/?lang=es-AR') assert resp.data == 'Hola mundo' resp = c.get('/fail/?lang=en-US') assert resp.data == ''
def _make_render(self): loader = ChoiceLoader([ FileSystemLoader(self.source_dir), PackageLoader('clay', config.SOURCE_DIR), ]) self.render = Render(loader=loader) self.render.set_filter('json', utils.filter_to_json)
def test_to_string(): render = Render(views_dir) resp = render('tmpl.txt', {'who': 'E.T.', 'action': 'phone', 'where':'home'}, to_string=True ) assert resp == 'E.T. phone home'
def __init__(self, source_dir, settings): self.source_dir = source_dir self.settings = settings loader = ChoiceLoader([ FileSystemLoader(source_dir), PackageLoader('clay', SOURCE_DIR), ]) self.render = JinjaRender(loader=loader)
def test_set_get_filters(): def double(val): return val * 2 def cut(text): return text[:3] render = Render() render.set_filter('double', double) render.set_filter('cut', cut) tmpl = '{{ 45|double }} {{ "abcytfugj"|cut }}' resp = render.from_string(tmpl) assert resp == '90 abc' assert render.get_filter('double') == double assert render.get_filter('cut') == cut
def test_default_globals_url_for(): render = Render() def foo(request): tmpl = "{{ url_for('foo') }}" assert render.from_string(tmpl) == '/' urls = [ Rule('/', foo, name='foo'), ] app = Shake(urls) c = app.test_client() c.get('/')
def test_default_globals(): render = Render() def foo(request): tmpl = '{{ media }}{{ request }}{{ settings }}' render.from_string(tmpl) urls = [ Rule('/', foo), ] app = Shake(urls) c = app.test_client() c.get('/')
def test_mimetype(): render1 = Render(views_dir) render2 = Render(views_dir, default_mimetype='foo/bar') def t1(request): resp = render1('view.html') assert isinstance(resp, local.app.response_class) assert resp.mimetype == 'text/html' def t2(request): resp = render2('view.html') assert isinstance(resp, local.app.response_class) assert resp.mimetype == 'foo/bar' urls = [ Rule('/t1', t1), Rule('/t2', t2), ] app = Shake(urls) local.app = app c = app.test_client() c.get('/t1') c.get('/t2')
def test_default_globals_flash_messages(): render = Render() def foo(request): flash(request, 'foo') tmpl = '{% for fm in get_messages() %}{{ fm.msg }}{% endfor %}' assert render.from_string(tmpl) == 'foo' urls = [ Rule('/', foo), ] settings = {'SECRET_KEY': 'abc' * 20} app = Shake(urls, settings) c = app.test_client() c.get('/')
def test_csrf_token_global(): render = Render() def t(request): csrf = get_csrf_secret(request) tmpl = '{{ csrf_secret.name }} {{ csrf_secret.value }}' assert render.from_string(tmpl) == '%s %s' % (csrf.name, csrf.value) urls = [ Rule('/', t), ] settings = {'SECRET_KEY': 'abc' * 20} app = Shake(urls, settings) c = app.test_client() c.get('/')
def test_csrf_token_query(): render = Render() def t(request): csrf = get_csrf_secret(request) tmpl = '{{ csrf_secret.query }}' expected = '%s=%s' % (csrf.name, csrf.value) assert render.from_string(tmpl) == expected urls = [ Rule('/', t), ] settings = {'SECRET_KEY': 'abc' * 20} app = Shake(urls, settings) c = app.test_client() c.get('/t')
def test_csrf_token(): render = Render() def t(request): csrf1 = get_csrf_secret(request).value csrf2 = new_csrf_secret(request).value csrf2_ = get_csrf_secret(request).value assert csrf2 != csrf1 assert csrf2_ == csrf2 urls = [ Rule('/', t), ] settings = {'SECRET_KEY': 'abc' * 20} app = Shake(urls, settings) c = app.test_client() c.get('/')
def test_csrf_token_input(): render = Render() def t(request): csrf = get_csrf_secret(request) tmpl = '{{ csrf_secret.input }}' expected = '<input type="hidden" name="%s" value="%s">' \ % (csrf.name, csrf.value) assert render.from_string(tmpl) == expected urls = [ Rule('/', t), ] settings = {'SECRET_KEY': 'abc' * 20} app = Shake(urls, settings) c = app.test_client() c.get('/t')
class Render(object): def __init__(self, source_dir, settings): self.source_dir = source_dir self.settings = settings loader = ChoiceLoader([ FileSystemLoader(source_dir), PackageLoader('clay', SOURCE_DIR), ]) self.render = JinjaRender(loader=loader) def __call__(self, path, **env): fn, ext = os.path.splitext(path) processor = enabled_processors.get(ext) content = u'' if processor: fullpath = os.path.join(self.source_dir, path) content, ext = processor.render(fullpath, self.settings) else: if ext in text_files: content = self.render.to_string(path, env) return content, ext
def test_view_not_found(): render = Render(views_dir) with pytest.raises(TemplateNotFound): render('x_x')
def test_default_globals_now(): render = Render() tmpl = '{{ now }}' snow = str(datetime.utcnow())[:-10] assert render.from_string(tmpl).startswith(snow)
def test_set_get_globals(): gg = {'who': 'E.T.', 'action': 'phone', 'where': 'home'} render = Render() render.set_global('who', 'E.T.') render.set_global('action', 'phone') render.set_global('where', 'home') tmpl = '{{ who }} {{ action }} {{ where }}' resp = render.from_string(tmpl) assert resp == 'E.T. phone home' assert render.get_global('who') == 'E.T.' assert render.get_global('action') == 'phone' assert render.get_global('where') == 'home'
# coding=utf-8 import os import pytest from shake import Shake, Rule, Render, Forbidden from shake.views import (not_found_page, error_page, not_allowed_page, render_template) HTTP_OK = 200 HTTP_FOUND = 302 HTTP_FORBIDDEN = 403 HTTP_NOT_FOUND = 404 HTTP_ERROR = 500 templates_dir = os.path.join(os.path.dirname(__file__), 'res') render = Render(templates_dir) def index(request): return 'hello' def fail(request): """View designed to fail. """ assert False def no_pass(request): raise Forbidden
""" import os import pytest from shake import Shake, abort, Rule, Render from shake.controllers import (not_found_page, error_page, not_allowed_page, render_view) HTTP_OK = 200 HTTP_FOUND = 302 HTTP_FORBIDDEN = 403 HTTP_NOT_FOUND = 404 HTTP_ERROR = 500 views_dir = os.path.join(os.path.dirname(__file__), 'res') render = Render(views_dir) def index(request): return 'hello' def fail(request): """Controller designed to fail. """ assert False def no_pass(request): abort(HTTP_FORBIDDEN)
def test_render(): render = Render(views_dir) resp = render('tmpl.html') assert isinstance(resp, Response) assert resp.data == '<h1>Hello World</h1>'
def test_default_tests(): render = Render() tmpl = '{% if value is ellipsis %}ok{% endif %}' resp = render.from_string(tmpl, value=Ellipsis) assert resp == 'ok'
def test_from_to_string(): render = Render() tmpl = 'Testing, {{ a }} {{ b }} {{ c }}...' resp = render.from_string(tmpl, a=1, b='2', c='3') assert resp == 'Testing, 1 2 3...'
class Clay(object): def __init__(self, base_dir, settings=None, source_dir=config.SOURCE_DIR): if os.path.isfile(base_dir): base_dir = os.path.abspath(os.path.dirname(base_dir)) self.base_dir = base_dir self.source_dir = utils.make_dirs(base_dir, source_dir) self.build_dir = os.path.join(base_dir, config.BUILD_DIR) settings = settings or {} self.settings = Settings(config.default_settings, settings, case_insensitive=True) theme_prefix = self.settings.get('theme_prefix', '').rstrip('/') if theme_prefix: theme_prefix += '/' self.settings['theme_prefix'] = theme_prefix views_ignore = self.settings.get('views_ignore', []) self.settings['views_ignore'] = tuple(views_ignore) self.app = Shake(config.app_settings) self._make_render() self._enable_pre_processors() self._add_urls() def _make_render(self): loader = ChoiceLoader([ FileSystemLoader(self.source_dir), PackageLoader('clay', config.SOURCE_DIR), ]) self.render = Render(loader=loader) self.render.set_filter('json', utils.filter_to_json) def _enable_pre_processors(self): ext_trans = {} processors = self.settings.pre_processors for name in processors: pr = globals().get('p_' + name) if pr and pr.enabled: pr.add_extensions(self) for ext in pr.extensions_in: ext_trans[ext] = pr.extension_out self.ext_trans = ext_trans def _add_urls(self): self.app.add_urls([ Rule('/', self.render_view), Rule('/<path:path>', self.render_view), ]) def _normalize_path(self, path): if '..' in path: return self.not_found() path = path.strip('/') is_dir = os.path.isdir(os.path.join(self.source_dir, path)) if is_dir: path += '/' if not path or is_dir: path += 'index.html' return path def _translate_ext(self, old_ext): return self.ext_trans.get(old_ext, old_ext) def _get_alternative(self, path): path = path.strip('/') fname, ext = os.path.splitext(path) fullpath = os.path.join(config.DEFAULT_TEMPLATES, path) if os.path.exists(fullpath): return ext, path, fullpath if path != 'index.html': return None, None, None pdir = os.path.join(self.source_dir, fname + '.*') files = glob.glob(pdir) if files: fullpath = files[0] path = fullpath.replace(self.source_dir, '') _, ext = os.path.splitext(path) return ext, path, fullpath return None, None, None def _post_process(self, html): html = utils.to_unicode(html) processors = self.settings.post_processors for name in processors: pp = globals().get('pp_' + name) if pp and pp.enabled: html = pp.process(html) return html def run(self, host=None, port=None): host = host if host is not None else self.settings.HOST port = port if port is not None else self.settings.PORT try: port = int(port) except Exception: port = self.settings.PORT ips = [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1] if ips: print ' * Your local IP is:', ips[0] try: self.app.run(host=host, port=port) except socket.error, e: print e