def test_after_environment_created_using_string(self): app = Tipfy( config={ 'tipfyext.jinja2': { 'after_environment_created': 'resources.jinja2_after_environment_created.after_creation' } }) local.request = Request.from_values() local.request.app = app handler = RequestHandler(local.request) jinja2 = Jinja2(app) template = jinja2.environment.from_string("""{{ 'Hey'|ho }}""") self.assertEqual(template.render(), 'Hey, Ho!')
def test_after_environment_created(self): def after_creation(environment): environment.filters['ho'] = lambda x: x + ', Ho!' app = Tipfy(config={ 'tipfyext.jinja2': { 'after_environment_created': after_creation } }) request = Request.from_values() local.current_handler = handler = RequestHandler(app, request) jinja2 = Jinja2(app) template = jinja2.environment.from_string("""{{ 'Hey'|ho }}""") self.assertEqual(template.render(), 'Hey, Ho!')
def test_render_template(self): app = Tipfy( config={'tipfyext.jinja2': { 'templates_dir': templates_dir }}) local.request = Request.from_values() local.request.app = app handler = RequestHandler(local.request) jinja2 = Jinja2(app) message = 'Hello, World!' res = jinja2.render_template(handler, 'template1.html', message=message) self.assertEqual(res, message)
def test_request_handler_get_config(self): app = Tipfy() with app.get_test_context() as request: handler = RequestHandler(request) self.assertEqual(handler.get_config('resources.i18n', 'locale'), 'en_US') self.assertEqual( handler.get_config('resources.i18n', 'locale', 'foo'), 'en_US') self.assertEqual( handler.get_config('resources.i18n'), { 'locale': 'en_US', 'timezone': 'America/Chicago', 'required': REQUIRED_VALUE, })
def test_jinja2_mixin_render_template(self): class MyHandler(RequestHandler, Jinja2Mixin): pass app = Tipfy( config={'tipfyext.jinja2': { 'templates_dir': templates_dir }}) local.request = Request.from_values() local.request.app = app handler = MyHandler(local.request) jinja2 = Jinja2(app) message = 'Hello, World!' response = handler.render_template('template1.html', message=message) self.assertEqual(response, message)
def test_render_response(self): app = Tipfy( config={'tipfyext.jinja2': { 'templates_dir': templates_dir }}) request = Request.from_values() local.current_handler = handler = RequestHandler(app, request) jinja2 = Jinja2(app) message = 'Hello, World!' response = jinja2.render_response(local.current_handler, 'template1.html', message=message) self.assertEqual(isinstance(response, Response), True) self.assertEqual(response.mimetype, 'text/html') self.assertEqual(response.data, message)
def test_handle_exception(self): app = Tipfy([ Rule('/', handler=AllMethodsHandler, name='home'), Rule('/broken', handler=BrokenHandler, name='broken'), Rule('/broken-but-fixed', handler=BrokenButFixedHandler, name='broken-but-fixed'), ], debug=False) client = app.get_test_client() response = client.get('/broken') self.assertEqual(response.status_code, 500) response = client.get('/broken-but-fixed') self.assertEqual(response.status_code, 200) self.assertEqual(response.data, 'That was close!')
def test_handle_exception_3(self): class MyMiddleware(object): def handle_exception(self, handler, exception): pass class MyHandler(RequestHandler): middleware = [MyMiddleware()] def get(self, **kwargs): raise ValueError() app = Tipfy(rules=[ Rule('/', name='home', handler=MyHandler), ]) client = app.get_test_client() response = client.get('/') self.assertEqual(response.status_code, 500)
def test_200(self): app = Tipfy(rules=[Rule('/', name='home', handler=AllMethodsHandler)]) client = app.get_test_client() for method in app.allowed_methods: response = client.open('/', method=method) self.assertEqual(response.status_code, 200, method) if method == 'HEAD': self.assertEqual(response.data, '') else: self.assertEqual(response.data, 'Method: %s' % method) # App Engine mode. self._set_dev_server_flag(True) response = client.get('/') self.assertEqual(response.status_code, 200) self.assertEqual(response.data, 'Method: GET')
def test_mako_mixin_render_response(self): class MyHandler(RequestHandler, MakoMixin): def __init__(self, app, request): self.app = app self.request = request self.context = {} app = Tipfy(config={'tipfyext.mako': {'templates_dir': templates_dir}}) request = Request.from_values() local.current_handler = handler = MyHandler(app, request) mako = Mako(app) message = 'Hello, World!' response = handler.render_response('template1.html', message=message) self.assertEqual(isinstance(response, Response), True) self.assertEqual(response.mimetype, 'text/html') self.assertEqual(response.data, message + '\n')
def test_regex_converter(self): class TestHandler(RequestHandler): def get(self, **kwargs): return Response(kwargs.get('path')) app = Tipfy([ Rule('/<regex(".*"):path>', name='home', handler=TestHandler), ]) client = app.get_test_client() response = client.get('/foo') self.assertEqual(response.data, 'foo') response = client.get('/foo/bar') self.assertEqual(response.data, 'foo/bar') response = client.get('/foo/bar/baz') self.assertEqual(response.data, 'foo/bar/baz')
def test_jinja2_mixin_render_template(self): class MyHandler(RequestHandler, Jinja2Mixin): def __init__(self, app, request): self.app = app self.request = request self.context = {} app = Tipfy( config={'tipfyext.jinja2': { 'templates_dir': templates_dir }}) request = Request.from_values() local.current_handler = handler = MyHandler(app, request) jinja2 = Jinja2(app) message = 'Hello, World!' response = handler.render_template('template1.html', message=message) self.assertEqual(response, message)
def test_store_instances(self): from tipfy.appengine.auth import AuthStore from tipfy.i18n import I18nStore from tipfy.sessions import SecureCookieSession app = Tipfy(rules=[ Rule('/', name='home', handler=AllMethodsHandler), ], config={ 'tipfy.sessions': { 'secret_key': 'secret', }, }) with app.get_test_handler('/') as handler: self.assertEqual(isinstance(handler.session, SecureCookieSession), True) self.assertEqual(isinstance(handler.auth, AuthStore), True) self.assertEqual(isinstance(handler.i18n, I18nStore), True)
def test_function_handler(self): rules = [ HandlerPrefix('resources.alternative_routing.', [ Rule('/', name='home', handler='home'), Rule('/foo', name='home/foo', handler='foo'), Rule('/bar', name='home/bar', handler='bar'), ]) ] app = Tipfy(rules) client = app.get_test_client() response = client.get('/') self.assertEqual(response.data, 'home') response = client.get('/foo') self.assertEqual(response.data, 'foo') response = client.get('/bar') self.assertEqual(response.data, 'bar')
def test_before_dispatch(self): res = 'Intercepted!' class MyMiddleware(object): def before_dispatch(self, handler): return Response(res) class MyHandler(RequestHandler): middleware = [MyMiddleware()] def get(self, **kwargs): return Response('default') app = Tipfy(rules=[ Rule('/', name='home', handler=MyHandler), ]) client = app.get_test_client() response = client.get('/') self.assertEqual(response.data, res)
def test_dev_run(self): self._set_dev_server_flag(True) os.environ['APPLICATION_ID'] = 'my-app' os.environ['SERVER_SOFTWARE'] = 'Development' os.environ['SERVER_NAME'] = 'localhost' os.environ['SERVER_PORT'] = '8080' os.environ['REQUEST_METHOD'] = 'GET' app = Tipfy(rules=[ Rule('/', name='home', handler=AllMethodsHandler), ], debug=True) app.run() self.assertEqual( sys.stdout.getvalue(), 'Status: 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 11\r\n\r\nMethod: GET' )
def test_handle_exception(self): res = 'Catched!' class MyMiddleware(object): def handle_exception(self, handler, exception): return Response(res) class MyHandler(RequestHandler): middleware = [MyMiddleware()] def get(self, **kwargs): raise ValueError() app = Tipfy(rules=[ Rule('/', name='home', handler=MyHandler), ]) client = app.get_test_client() response = client.get('/') self.assertEqual(response.data, res)
def test_render_response_force_compiled(self): app = Tipfy(config={ 'tipfyext.jinja2': { 'templates_compiled_target': templates_compiled_target, 'force_use_compiled': True, } }, debug=False) request = Request.from_values() local.current_handler = handler = RequestHandler(app, request) jinja2 = Jinja2(app) message = 'Hello, World!' response = jinja2.render_response(local.current_handler, 'template1.html', message=message) self.assertEqual(isinstance(response, Response), True) self.assertEqual(response.mimetype, 'text/html') self.assertEqual(response.data, message)
def test_handler_prefix(self): rules = [ HandlerPrefix('resources.handlers.', [ Rule('/', name='home', handler='HomeHandler'), Rule('/defaults', name='defaults', handler='HandlerWithRuleDefaults', defaults={'foo': 'bar'}), ]) ] app = Tipfy(rules) client = app.get_test_client() response = client.get('/') self.assertEqual(response.data, 'Hello, World!') response = client.get('/defaults') self.assertEqual(response.data, 'bar')
def test_url_for(self): class DummyHandler(RequestHandler): def get(self, **kwargs): return '' rules = [ NamePrefix('company-', [ Rule('/', name='home', handler=DummyHandler), Rule('/about', name='about', handler=DummyHandler), Rule('/contact', name='contact', handler=DummyHandler), ]), ] app = Tipfy(rules) with app.get_test_handler('/') as handler: self.assertEqual(url_for('company-home'), '/') self.assertEqual(url_for('company-about'), '/about') self.assertEqual(url_for('company-contact'), '/contact')
def test_abort(self): class HandlerWithAbort(RequestHandler): def get(self, **kwargs): self.abort(kwargs.get('status_code')) app = Tipfy(rules=[ Rule('/<int:status_code>', name='abort-me', handler=HandlerWithAbort), ]) client = app.get_test_client() response = client.get('/400') self.assertEqual(response.status_code, 400) response = client.get('/403') self.assertEqual(response.status_code, 403) response = client.get('/404') self.assertEqual(response.status_code, 404)
def get_app(): return Tipfy(rules=[ Rule('/', name='home', handler=HomeHandler), Rule('/people/<string:username>', name='profile', handler=ProfileHandler), Rule('/redirect_to/', name='redirect_to', handler=RedirectToHandler), Rule('/redirect_to/<string:username>', name='redirect_to', handler=RedirectToHandler), Rule('/redirect_to_301/', name='redirect_to', handler=RedirectTo301Handler), Rule('/redirect_to_301/<string:username>', name='redirect_to', handler=RedirectTo301Handler), Rule('/redirect_to_invalid', name='redirect_to_invalid', handler=RedirectToInvalidCodeHandler), ])
def test_url_for(self): app = Tipfy(rules=[ Rule('/', name='home', handler=AllMethodsHandler), Rule('/about', name='about', handler='handlers.About'), Rule('/contact', name='contact', handler='handlers.Contact'), ]) with app.get_test_handler('/') as handler: self.assertEqual(handler.url_for('home'), '/') self.assertEqual(handler.url_for('about'), '/about') self.assertEqual(handler.url_for('contact'), '/contact') # Extras self.assertEqual(handler.url_for('about', _anchor='history'), '/about#history') self.assertEqual(handler.url_for('about', _full=True), 'http://localhost/about') self.assertEqual( handler.url_for('about', _netloc='www.google.com'), 'http://www.google.com/about') self.assertEqual(handler.url_for('about', _scheme='https'), 'https://localhost/about')
def test_translations(self): app = Tipfy( config={ 'tipfyext.jinja2': { 'environment_args': { 'extensions': [ 'jinja2.ext.i18n', ], }, }, 'tipfy.sessions': { 'secret_key': 'foo', }, }) request = Request.from_values() local.current_handler = handler = RequestHandler(app, request) jinja2 = Jinja2(app) template = jinja2.environment.from_string( """{{ _('foo = %(bar)s', bar='foo') }}""") self.assertEqual(template.render(), 'foo = foo')
def test_engine_factory2(self): old_sys_path = sys.path[:] sys.path.insert(0, current_dir) app = Tipfy( config={ 'tipfyext.jinja2': { 'templates_dir': templates_dir, 'engine_factory': 'resources.get_jinja2_env', } }) request = Request.from_values() local.current_handler = handler = RequestHandler(app, request) jinja2 = Jinja2(app) message = 'Hello, World!' res = jinja2.render_template(local.current_handler, 'template1.html', message=message) self.assertEqual(res, message) sys.path = old_sys_path
def compile_templates(argv=None): """Compiles templates for better performance. This is a command line script. From the buildout directory, run: bin/jinja2_compile It will compile templates from the directory configured for 'templates_dir' to the one configured for 'templates_compiled_target'. At this time it doesn't accept any arguments. """ if argv is None: argv = sys.argv base_path = os.getcwd() app_path = os.path.join(base_path, 'app') gae_path = os.path.join(base_path, 'var/parts/google_appengine') extra_paths = [ app_path, os.path.join(app_path, 'lib'), os.path.join(app_path, 'lib', 'dist'), gae_path, # These paths are required by the SDK. os.path.join(gae_path, 'lib', 'antlr3'), os.path.join(gae_path, 'lib', 'django'), os.path.join(gae_path, 'lib', 'ipaddr'), os.path.join(gae_path, 'lib', 'webob'), os.path.join(gae_path, 'lib', 'yaml', 'lib'), ] sys.path = extra_paths + sys.path from config import config app = Tipfy(config=config) template_path = app.get_config('tipfyext.jinja2', 'templates_dir') compiled_path = app.get_config('tipfyext.jinja2', 'templates_compiled_target') if compiled_path is None: raise ValueError('Missing configuration key to compile templates.') if isinstance(template_path, basestring): # A single path. source = os.path.join(app_path, template_path) else: # A list of paths. source = [os.path.join(app_path, p) for p in template_path] target = os.path.join(app_path, compiled_path) # Set templates dir and deactivate compiled dir to use normal loader to # find the templates to be compiled. app.config['tipfyext.jinja2']['templates_dir'] = source app.config['tipfyext.jinja2']['templates_compiled_target'] = None if target.endswith('.zip'): zip_cfg = 'deflated' else: zip_cfg = None old_list_templates = FileSystemLoader.list_templates FileSystemLoader.list_templates = list_templates env = Jinja2.factory(app, 'jinja2').environment env.compile_templates(target, extensions=None, filter_func=filter_templates, zip=zip_cfg, log_function=logger, ignore_errors=False, py_compile=False) FileSystemLoader.list_templates = old_list_templates
def test_get_config(self): app = Tipfy(config={'tipfy': {'foo': 'bar'}}) self.assertEqual(app.get_config('tipfy', 'foo'), 'bar')
from google.appengine.ext.appstats.recording import appstats_wsgi_middleware app.wsgi_app = appstats_wsgi_middleware(app.wsgi_app) def enable_jinja2_debugging(): """Enables blacklisted modules that help Jinja2 debugging.""" if not debug: return # This enables better debugging info for errors in Jinja2 templates. from google.appengine.tools.dev_appserver import HardenedModulesHook HardenedModulesHook._WHITE_LIST_C_MODULES += ['_ctypes', 'gestalt'] # Is this the development server? debug = os.environ.get('SERVER_SOFTWARE', '').startswith('Dev') # Instantiate the application. app = Tipfy(rules=rules, config=config, debug=debug) enable_appstats(app) enable_jinja2_debugging() def main(): # Run the app. app.run() if __name__ == '__main__': main()
def get_app(): return Tipfy({ 'tipfy': { 'dev': True, }, }, rules=get_url_rules())
def _get_app(self): return Tipfy(config={ 'tipfy.sessions': { 'secret_key': 'something very secret', } })