blob: e38299f2553a5ed70bfccd758640bc32f1958873 [file] [log] [blame]
Armin Ronacherab45b842007-03-18 20:47:50 +01001# -*- coding: utf-8 -*-
2"""
3 conftest
4 ~~~~~~~~
5
6 Configure py.test for support stuff.
7
8 :copyright: 2007 by Armin Ronacher, Alexander Schremmer.
9 :license: BSD, see LICENSE for more details.
10"""
11
12import os
13import sys
14sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
15
16import py
Christoph Hacke9e43bb2008-04-13 23:35:48 +020017from jinja2 import Environment
Armin Ronacherf41d1392008-04-18 16:41:52 +020018from jinja2.loaders import BaseLoader
19from jinja2.exceptions import TemplateNotFound
Armin Ronacherab45b842007-03-18 20:47:50 +010020
Armin Ronacherccf284b2007-05-21 16:44:26 +020021try:
22 # This code adds support for coverage.py (see
23 # http://nedbatchelder.com/code/modules/coverage.html).
24 # It prints a coverage report for the modules specified in all
25 # module globals (of the test modules) named "coverage_modules".
26
27 import coverage, atexit
28
Christoph Hacke9e43bb2008-04-13 23:35:48 +020029 IGNORED_MODULES = ['jinja2._speedups', 'jinja2.defaults',
30 'jinja2.translators']
Armin Ronacherccf284b2007-05-21 16:44:26 +020031
32 def report_coverage():
33 coverage.stop()
34 module_list = [
35 mod for name, mod in sys.modules.copy().iteritems() if
36 getattr(mod, '__file__', None) and
Christoph Hacke9e43bb2008-04-13 23:35:48 +020037 name.startswith('jinja2.') and
Armin Ronacherccf284b2007-05-21 16:44:26 +020038 name not in IGNORED_MODULES
39 ]
40 module_list.sort()
41 coverage.report(module_list)
42
43 def callback(option, opt_str, value, parser):
44 atexit.register(report_coverage)
45 coverage.erase()
46 coverage.start()
47
48 py.test.config.addoptions('Test options', py.test.config.Option('-C',
49 '--coverage', action='callback', callback=callback,
50 help='Output information about code coverage (slow!)'))
51
52except ImportError:
53 coverage = None
54
Armin Ronacherab45b842007-03-18 20:47:50 +010055
Armin Ronacherf41d1392008-04-18 16:41:52 +020056class GlobalLoader(BaseLoader):
57 scope = globals()
Armin Ronacherc1e30402007-03-18 22:41:09 +010058
Armin Ronacherf41d1392008-04-18 16:41:52 +020059 def get_source(self, environment, name):
60 try:
61 return self.scope[name.upper() + 'TEMPLATE'], None, None
62 except KeyError:
63 raise TemplateNotFound(name)
Armin Ronacherc1e30402007-03-18 22:41:09 +010064
65
Armin Ronacherf41d1392008-04-18 16:41:52 +020066loader = GlobalLoader(cache_size=0)
Christoph Hacke9e43bb2008-04-13 23:35:48 +020067simple_env = Environment(trim_blocks=True, loader=loader)
Armin Ronacherab45b842007-03-18 20:47:50 +010068
69
70class Module(py.test.collect.Module):
71
72 def __init__(self, *args, **kwargs):
73 self.env = simple_env
74 super(Module, self).__init__(*args, **kwargs)
75
Armin Ronacherccf284b2007-05-21 16:44:26 +020076 def makeitem(self, name, obj, usefilters=True):
77 if name.startswith('test_'):
78 if hasattr(obj, 'func_code'):
79 return JinjaTestFunction(name, parent=self)
80 elif isinstance(obj, basestring):
81 return JinjaDocTest(name, parent=self)
Armin Ronacherab45b842007-03-18 20:47:50 +010082
83
84class JinjaTestFunction(py.test.collect.Function):
85
86 def execute(self, target, *args):
Armin Ronacherc1e30402007-03-18 22:41:09 +010087 loader.scope = target.func_globals
Armin Ronacherab45b842007-03-18 20:47:50 +010088 co = target.func_code
89 if 'env' in co.co_varnames[:co.co_argcount]:
90 target(self.parent.env, *args)
91 else:
92 target(*args)
Armin Ronacherccf284b2007-05-21 16:44:26 +020093
94
95class JinjaDocTest(py.test.collect.Item):
96
97 def run(self):
98 mod = py.std.types.ModuleType(self.name)
99 mod.__doc__ = self.obj
100 self.execute(mod)
101
102 def execute(self, mod):
103 mod.env = self.parent.env
104 mod.MODULE = self.parent.obj
105 failed, tot = py.compat.doctest.testmod(mod, verbose=True)
106 if failed:
107 py.test.fail('doctest %s: %s failed out of %s' % (
108 self.fspath, failed, tot))