Index: appengine/components/components/third_party/jinja2/_compat.py |
diff --git a/appengine/components/components/third_party/jinja2/_compat.py b/appengine/components/components/third_party/jinja2/_compat.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ebe743307451c7923f1a2cb1c728b76aedb5b00b |
--- /dev/null |
+++ b/appengine/components/components/third_party/jinja2/_compat.py |
@@ -0,0 +1,102 @@ |
+# -*- coding: utf-8 -*- |
+""" |
+ jinja2._compat |
+ ~~~~~~~~~~~~~~ |
+ |
+ Some py2/py3 compatibility support based on a stripped down |
+ version of six so we don't have to depend on a specific version |
+ of it. |
+ |
+ :copyright: Copyright 2013 by the Jinja team, see AUTHORS. |
+ :license: BSD, see LICENSE for details. |
+""" |
+import sys |
+ |
+PY2 = sys.version_info[0] == 2 |
+PYPY = hasattr(sys, 'pypy_translation_info') |
+_identity = lambda x: x |
+ |
+ |
+if not PY2: |
+ unichr = chr |
+ range_type = range |
+ text_type = str |
+ string_types = (str,) |
+ integer_types = (int,) |
+ |
+ iterkeys = lambda d: iter(d.keys()) |
+ itervalues = lambda d: iter(d.values()) |
+ iteritems = lambda d: iter(d.items()) |
+ |
+ import pickle |
+ from io import BytesIO, StringIO |
+ NativeStringIO = StringIO |
+ |
+ def reraise(tp, value, tb=None): |
+ if value.__traceback__ is not tb: |
+ raise value.with_traceback(tb) |
+ raise value |
+ |
+ ifilter = filter |
+ imap = map |
+ izip = zip |
+ intern = sys.intern |
+ |
+ implements_iterator = _identity |
+ implements_to_string = _identity |
+ encode_filename = _identity |
+ get_next = lambda x: x.__next__ |
+ |
+else: |
+ unichr = unichr |
+ text_type = unicode |
+ range_type = xrange |
+ string_types = (str, unicode) |
+ integer_types = (int, long) |
+ |
+ iterkeys = lambda d: d.iterkeys() |
+ itervalues = lambda d: d.itervalues() |
+ iteritems = lambda d: d.iteritems() |
+ |
+ import cPickle as pickle |
+ from cStringIO import StringIO as BytesIO, StringIO |
+ NativeStringIO = BytesIO |
+ |
+ exec('def reraise(tp, value, tb=None):\n raise tp, value, tb') |
+ |
+ from itertools import imap, izip, ifilter |
+ intern = intern |
+ |
+ def implements_iterator(cls): |
+ cls.next = cls.__next__ |
+ del cls.__next__ |
+ return cls |
+ |
+ def implements_to_string(cls): |
+ cls.__unicode__ = cls.__str__ |
+ cls.__str__ = lambda x: x.__unicode__().encode('utf-8') |
+ return cls |
+ |
+ get_next = lambda x: x.next |
+ |
+ def encode_filename(filename): |
+ if isinstance(filename, unicode): |
+ return filename.encode('utf-8') |
+ return filename |
+ |
+ |
+def with_metaclass(meta, *bases): |
+ """Create a base class with a metaclass.""" |
+ # This requires a bit of explanation: the basic idea is to make a |
+ # dummy metaclass for one level of class instantiation that replaces |
+ # itself with the actual metaclass. |
+ class metaclass(type): |
+ def __new__(cls, name, this_bases, d): |
+ return meta(name, bases, d) |
+ return type.__new__(metaclass, 'temporary_class', (), {}) |
+ |
+ |
+try: |
+ from urllib.parse import quote_from_bytes as url_quote |
+except ImportError: |
+ from urllib import quote as url_quote |