summaryrefslogtreecommitdiff
path: root/mako/compat.py
diff options
context:
space:
mode:
Diffstat (limited to 'mako/compat.py')
-rw-r--r--mako/compat.py120
1 files changed, 30 insertions, 90 deletions
diff --git a/mako/compat.py b/mako/compat.py
index 2444cad..4460fde 100644
--- a/mako/compat.py
+++ b/mako/compat.py
@@ -4,37 +4,49 @@
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
-import json # noqa
+import collections
+import inspect
import sys
py3k = sys.version_info >= (3, 0)
-py33 = sys.version_info >= (3, 3)
py2k = sys.version_info < (3,)
py27 = sys.version_info >= (2, 7)
jython = sys.platform.startswith("java")
win32 = sys.platform.startswith("win")
pypy = hasattr(sys, "pypy_version_info")
-if py3k:
- # create a "getargspec" from getfullargspec(), which is not deprecated
- # in Py3K; getargspec() has started to emit warnings as of Py3.5.
- # As of Py3.4, now they are trying to move from getfullargspec()
- # to "signature()", but getfullargspec() is not deprecated, so stick
- # with that for now.
+ArgSpec = collections.namedtuple(
+ "ArgSpec", ["args", "varargs", "keywords", "defaults"]
+)
- import collections
- ArgSpec = collections.namedtuple(
- "ArgSpec", ["args", "varargs", "keywords", "defaults"]
- )
- from inspect import getfullargspec as inspect_getfullargspec
+def inspect_getargspec(func):
+ """getargspec based on fully vendored getfullargspec from Python 3.3."""
- def inspect_getargspec(func):
- return ArgSpec(*inspect_getfullargspec(func)[0:4])
+ if inspect.ismethod(func):
+ func = func.__func__
+ if not inspect.isfunction(func):
+ raise TypeError("{!r} is not a Python function".format(func))
+ co = func.__code__
+ if not inspect.iscode(co):
+ raise TypeError("{!r} is not a code object".format(co))
-else:
- from inspect import getargspec as inspect_getargspec # noqa
+ nargs = co.co_argcount
+ names = co.co_varnames
+ nkwargs = co.co_kwonlyargcount if py3k else 0
+ args = list(names[:nargs])
+
+ nargs += nkwargs
+ varargs = None
+ if co.co_flags & inspect.CO_VARARGS:
+ varargs = co.co_varnames[nargs]
+ nargs = nargs + 1
+ varkw = None
+ if co.co_flags & inspect.CO_VARKEYWORDS:
+ varkw = co.co_varnames[nargs]
+
+ return ArgSpec(args, varargs, varkw, func.__defaults__)
if py3k:
@@ -86,7 +98,7 @@ else:
return eval("0" + lit)
-if py33:
+if py3k:
from importlib import machinery
def load_module(module_id, path):
@@ -125,34 +137,6 @@ def exception_as():
return sys.exc_info()[1]
-try:
- import threading
-
- if py3k:
- import _thread as thread
- else:
- import thread
-except ImportError:
- import dummy_threading as threading # noqa
-
- if py3k:
- import _dummy_thread as thread
- else:
- import dummy_thread as thread # noqa
-
-try:
- from functools import partial
-except:
-
- def partial(func, *args, **keywords):
- def newfunc(*fargs, **fkeywords):
- newkeywords = keywords.copy()
- newkeywords.update(fkeywords)
- return func(*(args + fargs), **newkeywords)
-
- return newfunc
-
-
all = all # noqa
@@ -160,50 +144,6 @@ def exception_name(exc):
return exc.__class__.__name__
-try:
- from inspect import CO_VARKEYWORDS, CO_VARARGS
-
- def inspect_func_args(fn):
- if py3k:
- co = fn.__code__
- else:
- co = fn.func_code
-
- nargs = co.co_argcount
- names = co.co_varnames
- args = list(names[:nargs])
-
- varargs = None
- if co.co_flags & CO_VARARGS:
- varargs = co.co_varnames[nargs]
- nargs = nargs + 1
- varkw = None
- if co.co_flags & CO_VARKEYWORDS:
- varkw = co.co_varnames[nargs]
-
- if py3k:
- return args, varargs, varkw, fn.__defaults__
- else:
- return args, varargs, varkw, fn.func_defaults
-
-
-except ImportError:
- import inspect
-
- def inspect_func_args(fn):
- return inspect.getargspec(fn)
-
-
-if py3k:
- # TODO: this has been restored in py3k
- def callable(fn): # noqa
- return hasattr(fn, "__call__")
-
-
-else:
- callable = callable # noqa
-
-
################################################
# cross-compatible metaclass implementation
# Copyright (c) 2010-2012 Benjamin Peterson