Implemented and documented "joiner"
--HG--
branch : trunk
diff --git a/jinja2/defaults.py b/jinja2/defaults.py
index 61706ae..3e24e7d 100644
--- a/jinja2/defaults.py
+++ b/jinja2/defaults.py
@@ -8,7 +8,7 @@
:copyright: 2007-2008 by Armin Ronacher.
:license: BSD, see LICENSE for more details.
"""
-from jinja2.utils import generate_lorem_ipsum, Cycler
+from jinja2.utils import generate_lorem_ipsum, Cycler, Joiner
# defaults for the parser / lexer
@@ -30,7 +30,8 @@
'range': xrange,
'dict': lambda **kw: kw,
'lipsum': generate_lorem_ipsum,
- 'cycler': Cycler
+ 'cycler': Cycler,
+ 'joiner': Joiner
}
diff --git a/jinja2/loaders.py b/jinja2/loaders.py
index 8b2221f..c61cd84 100644
--- a/jinja2/loaders.py
+++ b/jinja2/loaders.py
@@ -149,8 +149,14 @@
contents = f.read().decode(self.encoding)
finally:
f.close()
- old = path.getmtime(filename)
- return contents, filename, lambda: path.getmtime(filename) == old
+
+ mtime = path.getmtime(filename)
+ def uptodate():
+ try:
+ return path.getmtime(filename) == mtime
+ except OSError:
+ return False
+ return contents, filename, uptodate
raise TemplateNotFound(template)
@@ -191,7 +197,10 @@
filename = self.provider.get_resource_filename(self.manager, p)
mtime = path.getmtime(filename)
def uptodate():
- return path.getmtime(filename) == mtime
+ try:
+ return path.getmtime(filename) == mtime
+ except OSError:
+ return False
source = self.provider.get_resource_string(self.manager, p)
return source.decode(self.encoding), filename, uptodate
diff --git a/jinja2/utils.py b/jinja2/utils.py
index 338db4a..249e363 100644
--- a/jinja2/utils.py
+++ b/jinja2/utils.py
@@ -685,6 +685,20 @@
return rv
+class Joiner(object):
+ """A joining helper for templates."""
+
+ def __init__(self, sep=u', '):
+ self.sep = sep
+ self.used = False
+
+ def __call__(self):
+ if not self.used:
+ self.used = True
+ return u''
+ return self.sep
+
+
# we have to import it down here as the speedups module imports the
# markup type which is define above.
try: