summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/build/unreleased/249.rst14
-rw-r--r--doc/build/unreleased/295.rst9
-rw-r--r--mako/codegen.py3
-rw-r--r--mako/compat.py120
-rw-r--r--mako/ext/pygmentplugin.py2
-rw-r--r--mako/runtime.py19
-rw-r--r--mako/template.py3
-rw-r--r--setup.cfg3
-rw-r--r--setup.py25
-rw-r--r--test/__init__.py3
-rw-r--r--tox.ini4
11 files changed, 78 insertions, 127 deletions
diff --git a/doc/build/unreleased/249.rst b/doc/build/unreleased/249.rst
new file mode 100644
index 0000000..206a72a
--- /dev/null
+++ b/doc/build/unreleased/249.rst
@@ -0,0 +1,14 @@
+.. change::
+ :tags: change, py3k, installer
+ :tickets: 249
+
+ Mako 1.1 now supports Python versions:
+
+ * 2.7
+ * 3.4 and higher
+
+ This includes that setup.py no longer includes any conditionals, allowing
+ for a pure Python wheel build, however this is not necessarily part of the
+ Pypi release process as of yet. The test suite also raises for Python
+ deprecation warnings.
+
diff --git a/doc/build/unreleased/295.rst b/doc/build/unreleased/295.rst
new file mode 100644
index 0000000..147d23b
--- /dev/null
+++ b/doc/build/unreleased/295.rst
@@ -0,0 +1,9 @@
+.. change::
+ :tags: bug, py3k
+ :tickets: 295
+
+ Replaced usage of ``inspect.getfullargspec()`` with the vendored version
+ used by SQLAlchemy, Alembic to avoid future deprecation warnings. Also
+ cleans up an additional version of the same function that's apparently
+ been floating around for some time.
+
diff --git a/mako/codegen.py b/mako/codegen.py
index 5ca7b04..8f9eef4 100644
--- a/mako/codegen.py
+++ b/mako/codegen.py
@@ -7,6 +7,7 @@
"""provides functionality for rendering a parsetree constructing into module
source code."""
+import json
import re
import time
@@ -176,7 +177,7 @@ class _GenerateRenderMethod(object):
self.printer.writelines(
'"""',
"__M_BEGIN_METADATA",
- compat.json.dumps(struct),
+ json.dumps(struct),
"__M_END_METADATA\n" '"""',
)
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
diff --git a/mako/ext/pygmentplugin.py b/mako/ext/pygmentplugin.py
index 2824693..1734ccd 100644
--- a/mako/ext/pygmentplugin.py
+++ b/mako/ext/pygmentplugin.py
@@ -59,7 +59,7 @@ class MakoLexer(RegexLexer):
),
(r"<%(?=([\w\.\:]+))", Comment.Preproc, "ondeftags"),
(
- r"(<%(?:!?))(.*?)(%>)(?s)",
+ r"(?s)(<%(?:!?))(.*?)(%>)",
bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc),
),
(
diff --git a/mako/runtime.py b/mako/runtime.py
index 0956cd0..0e7149b 100644
--- a/mako/runtime.py
+++ b/mako/runtime.py
@@ -7,6 +7,7 @@
"""provides runtime services for templates, including Context,
Namespace, and various helper functions."""
+import functools
import sys
from mako import compat
@@ -37,7 +38,7 @@ class Context(object):
# "capture" function which proxies to the
# generic "capture" function
- self._data["capture"] = compat.partial(capture, self)
+ self._data["capture"] = functools.partial(capture, self)
# "caller" stack used by def calls with content
self.caller_stack = self._data["caller"] = CallerStack()
@@ -625,7 +626,7 @@ class TemplateNamespace(Namespace):
def get(key):
callable_ = self.template._get_def_callable(key)
- return compat.partial(callable_, self.context)
+ return functools.partial(callable_, self.context)
for k in self.template.module._exports:
yield (k, get(k))
@@ -635,7 +636,7 @@ class TemplateNamespace(Namespace):
val = self.callables[key]
elif self.template.has_def(key):
callable_ = self.template._get_def_callable(key)
- val = compat.partial(callable_, self.context)
+ val = functools.partial(callable_, self.context)
elif self.inherits:
val = getattr(self.inherits, key)
@@ -686,15 +687,15 @@ class ModuleNamespace(Namespace):
for key in dir(self.module):
if key[0] != "_":
callable_ = getattr(self.module, key)
- if compat.callable(callable_):
- yield key, compat.partial(callable_, self.context)
+ if callable(callable_):
+ yield key, functools.partial(callable_, self.context)
def __getattr__(self, key):
if key in self.callables:
val = self.callables[key]
elif hasattr(self.module, key):
callable_ = getattr(self.module, key)
- val = compat.partial(callable_, self.context)
+ val = functools.partial(callable_, self.context)
elif self.inherits:
val = getattr(self.inherits, key)
else:
@@ -731,7 +732,7 @@ def capture(context, callable_, *args, **kwargs):
"""
- if not compat.callable(callable_):
+ if not callable(callable_):
raise exceptions.RuntimeException(
"capture() function expects a callable as "
"its argument (i.e. capture(func, *args, **kwargs))"
@@ -885,7 +886,7 @@ def _render(template, callable_, args, data, as_unicode=False):
def _kwargs_for_callable(callable_, data):
- argspec = compat.inspect_func_args(callable_)
+ argspec = compat.inspect_getargspec(callable_)
# for normal pages, **pageargs is usually present
if argspec[2]:
return data
@@ -900,7 +901,7 @@ def _kwargs_for_callable(callable_, data):
def _kwargs_for_include(callable_, data, **kwargs):
- argspec = compat.inspect_func_args(callable_)
+ argspec = compat.inspect_getargspec(callable_)
namedargs = argspec[0] + [v for v in argspec[1:3] if v is not None]
for arg in namedargs:
if arg != "context" and arg in data and arg not in kwargs:
diff --git a/mako/template.py b/mako/template.py
index 8e87d50..937d15b 100644
--- a/mako/template.py
+++ b/mako/template.py
@@ -7,6 +7,7 @@
"""Provides the Template class, a facade for parsing, generating and executing
template strings, as well as template runtime operations."""
+import json
import os
import re
import shutil
@@ -659,7 +660,7 @@ class ModuleInfo(object):
source_map = re.search(
r"__M_BEGIN_METADATA(.+?)__M_END_METADATA", module_source, re.S
).group(1)
- source_map = compat.json.loads(source_map)
+ source_map = json.loads(source_map)
source_map["line_map"] = dict(
(int(k), int(v)) for k, v in source_map["line_map"].items()
)
diff --git a/setup.cfg b/setup.cfg
index 59bac7f..5e0292c 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -4,7 +4,7 @@ tag_build = dev
[tool:pytest]
-addopts= --tb native -v -r fxX
+addopts= --tb native -v -r fxX -W error
python_files=test/*test_*.py
@@ -13,6 +13,7 @@ sign = 1
identity = C4DAFEE1
[flake8]
+show-source = true
enable-extensions = G
# E203 is due to https://github.com/PyCQA/pycodestyle/issues/373
ignore =
diff --git a/setup.py b/setup.py
index 17b6c70..68b46ef 100644
--- a/setup.py
+++ b/setup.py
@@ -14,24 +14,9 @@ VERSION = (
)
v.close()
-readme = open(os.path.join(os.path.dirname(__file__), "README.rst")).read()
+readme = os.path.join(os.path.dirname(__file__), "README.rst")
-if sys.version_info < (2, 6):
- raise Exception("Mako requires Python 2.6 or higher.")
-
-markupsafe_installs = (
- sys.version_info >= (2, 6) and sys.version_info < (3, 0)
-) or sys.version_info >= (3, 3)
-
-install_requires = []
-
-if markupsafe_installs:
- install_requires.append("MarkupSafe>=0.9.2")
-
-try:
- import argparse # noqa
-except ImportError:
- install_requires.append("argparse")
+install_requires = ["MarkupSafe>=0.9.2"]
class PyTest(TestCommand):
@@ -59,7 +44,8 @@ setup(
version=VERSION,
description="A super-fast templating language that borrows the \
best ideas from the existing templating languages.",
- long_description=readme,
+ long_description=open(readme).read(),
+ python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
classifiers=[
"Development Status :: 5 - Production/Stable",
"License :: OSI Approved :: MIT License",
@@ -77,14 +63,13 @@ setup(
url="https://www.makotemplates.org/",
project_urls={
"Documentation": "https://docs.makotemplates.org",
- "Issue Tracker": "https://github.com/sqlalchemy/mako"
+ "Issue Tracker": "https://github.com/sqlalchemy/mako",
},
license="MIT",
packages=find_packages(".", exclude=["examples*", "test*"]),
tests_require=["pytest", "mock"],
cmdclass={"test": PyTest},
zip_safe=False,
- python_requires=">=2.6",
install_requires=install_requires,
extras_require={},
entry_points="""
diff --git a/test/__init__.py b/test/__init__.py
index b91e709..c5c9e91 100644
--- a/test/__init__.py
+++ b/test/__init__.py
@@ -6,7 +6,6 @@ import unittest
from mako import compat
from mako.cache import CacheImpl
from mako.cache import register_plugin
-from mako.compat import py33
from mako.compat import py3k
from mako.template import Template
from mako.util import update_wrapper
@@ -106,7 +105,7 @@ def teardown():
shutil.rmtree(module_base, True)
-if py33:
+if py3k:
from unittest import mock # noqa
else:
import mock # noqa
diff --git a/tox.ini b/tox.ini
index 45b48d1..b1a1e81 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,10 +1,10 @@
[tox]
-envlist = py{27,35,36,37,38}
+envlist = py{27,34,35,36,37,38}
[testenv]
cov_args=--cov=mako --cov-report term --cov-report xml
-deps=pytest
+deps=pytest>=3.1.0
mock
beaker
markupsafe