Skip to content

Commit cbbe9ea

Browse files
committed
{% ssi %} doesn't trace its included files. So be it.
1 parent 35a7805 commit cbbe9ea

File tree

4 files changed

+65
-8
lines changed

4 files changed

+65
-8
lines changed

README.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ file. The ``source=``, ``include=``, and ``omit=`` options control what
3535
template files are included in the report.
3636

3737

38+
Caveats
39+
-------
40+
41+
The `{% ssi %}` tag does not trace the files it includes.
42+
43+
3844
What the? How?
3945
--------------
4046

django_coverage_plugin/plugin.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from __future__ import print_function
44

55
import os.path
6+
67
from six.moves import range
78

89
import coverage.plugin
@@ -77,9 +78,7 @@ def dynamic_source_filename(self, filename, frame):
7778
if 0:
7879
dump_frame(frame)
7980
try:
80-
source = render_self.source
81-
origin = source[0]
82-
filename = origin.name
81+
filename = render_self.source[0].name
8382
if filename.startswith("<"):
8483
# String templates have a filename of "<unknown source>", and
8584
# can't be reported on later, so ignore them.
@@ -91,6 +90,8 @@ def dynamic_source_filename(self, filename, frame):
9190

9291
def line_number_range(self, frame):
9392
assert frame.f_code.co_name == 'render'
93+
if 0:
94+
dump_frame(frame, label="line_number_range")
9495
render_self = frame.f_locals['self']
9596
source = render_self.source
9697
if SHOW_TRACING:
@@ -255,14 +256,16 @@ def get_line_number(line_map, offset):
255256
return -1
256257

257258

258-
def dump_frame(frame):
259+
def dump_frame(frame, label=""):
259260
"""Dump interesting information about this frame."""
260-
locals = frame.f_locals
261+
locals = dict(frame.f_locals)
261262
self = locals.get('self', None)
262263
if "__builtins__" in locals:
263264
del locals["__builtins__"]
264265

265-
print("-- frame -----------------------")
266+
if label:
267+
label = " ( %s ) " % label
268+
print("-- frame --%s---------------------" % label)
266269
print("{}:{}:{}".format(
267270
os.path.basename(frame.f_code.co_filename),
268271
frame.f_lineno,
@@ -271,3 +274,4 @@ def dump_frame(frame):
271274
print(locals)
272275
if self:
273276
print("self:", self.__dict__)
277+
print("\\--")

tests/plugin_test.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
}
2727
},
2828
TEMPLATE_DEBUG=True,
29+
ALLOWED_INCLUDE_ROOTS=["/"], # for {% ssi %}
2930
)
3031

3132
if hasattr(django, "setup"):
@@ -55,7 +56,7 @@ def make_template(self, text, name=None):
5556
else:
5657
self.template_file = self.id().rpartition(".")[2] + ".html"
5758
template_path = self.path(self.template_file)
58-
self.make_file(template_path, text)
59+
return os.path.abspath(self.make_file(template_path, text))
5960

6061
def run_django_coverage(
6162
self, name=None, text=None, context=None, options=None,
@@ -117,6 +118,10 @@ def get_analysis(self, name=None):
117118
_, executable, _, missing, _ = analysis
118119
return executable, missing
119120

121+
def measured_files(self):
122+
"""Get the list of measured files, in relative form."""
123+
return [os.path.relpath(f) for f in self.cov.data.measured_files()]
124+
120125
def assert_analysis(self, executable, missing=None, name=None):
121126
"""Assert that the analysis for `name` is right."""
122127
actual_executable, actual_missing = self.get_analysis(name)

tests/test_extends.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Tests of template inheritance for django_coverage_plugin."""
22

3-
from .plugin_test import DjangoPluginTestCase
3+
from .plugin_test import DjangoPluginTestCase, needs_django
44

55

66
class BlockTest(DjangoPluginTestCase):
@@ -143,3 +143,45 @@ def test_include(self):
143143
self.assertEqual(text, "First\nInside\nJob\n\nLast\n")
144144
self.assert_analysis([1, 2, 3], name="outer.html")
145145
self.assert_analysis([1, 2], name="nested.html")
146+
147+
148+
# {% ssi %} is in earlier Djangos than 1.5, but doesn't trace properly.
149+
@needs_django(1, 5)
150+
class SsiTest(DjangoPluginTestCase):
151+
"""Test {% ssi %}, which does not trace the included file."""
152+
153+
def test_ssi_unparsed(self):
154+
nested = self.make_template(name="nested.html", text="""\
155+
Inside {{ a }}
156+
Job
157+
""")
158+
159+
self.make_template(name="outer.html", text="""\
160+
First
161+
{% ssi "NESTED" %}
162+
Last
163+
""".replace("NESTED", nested))
164+
165+
text = self.run_django_coverage(name="outer.html", context={'a': 17})
166+
self.assertEqual(text, "First\nInside {{ a }}\nJob\n\nLast\n")
167+
self.assert_analysis([1, 2, 3], name="outer.html")
168+
# nested.html is not among the measured files:
169+
self.assertEqual(self.measured_files(), ["templates/outer.html"])
170+
171+
def test_ssi_parsed(self):
172+
nested = self.make_template(name="nested.html", text="""\
173+
Inside {{ a }}
174+
Job
175+
""")
176+
177+
self.make_template(name="outer.html", text="""\
178+
First
179+
{% ssi "NESTED" parsed %}
180+
Last
181+
""".replace("NESTED", nested))
182+
183+
text = self.run_django_coverage(name="outer.html", context={'a': 17})
184+
self.assertEqual(text, "First\nInside 17\nJob\n\nLast\n")
185+
self.assert_analysis([1, 2, 3], name="outer.html")
186+
# nested.html is not among the measured files:
187+
self.assertEqual(self.measured_files(), ["templates/outer.html"])

0 commit comments

Comments
 (0)