summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Petrello <lists@ryanpetrello.com>2013-09-17 17:33:32 -0400
committerRyan Petrello <lists@ryanpetrello.com>2013-09-22 21:14:26 -0400
commit435e5fa34a6a87129f6922c18fa36e26d60e4e7f (patch)
tree08d083d1160e95597c752e645d2200b79a988e48
parent09ea1274589d51104d89d2b325906aa0a36c181a (diff)
downloadpecan-435e5fa34a6a87129f6922c18fa36e26d60e4e7f.tar.gz
Replace simplegeneric with singledispatch (PEP 443).
Closes-Bug: #1226813 Change-Id: I1ba149ac00353460065d4cddbe3ccd8782aaa611
-rw-r--r--docs/source/jsonify.rst6
-rw-r--r--pecan/decorators.py7
-rw-r--r--pecan/jsonify.py30
-rw-r--r--requirements.txt1
-rw-r--r--setup.py13
5 files changed, 39 insertions, 18 deletions
diff --git a/docs/source/jsonify.rst b/docs/source/jsonify.rst
index ac06c30..b5c6053 100644
--- a/docs/source/jsonify.rst
+++ b/docs/source/jsonify.rst
@@ -9,9 +9,7 @@ JSON. To get started, create a file in your project called
``json.py`` and import it in your project's ``app.py``.
Your ``json`` module will contain a series of rules for generating
-JSON from objects you return in your controller, utilizing
-"generic" function support from the
-`simplegeneric <http://pypi.python.org/pypi/simplegeneric>`_ library.
+JSON from objects you return in your controller.
Let's say that we have a controller in our Pecan application which
we want to use to return JSON output for a :class:`User` object::
@@ -35,7 +33,7 @@ rule in your ``json.py``::
from pecan.jsonify import jsonify
from myproject import model
- @jsonify.when_type(model.User)
+ @jsonify.register(model.User)
def jsonify_user(user):
return dict(
name = user.name,
diff --git a/pecan/decorators.py b/pecan/decorators.py
index 2938fc1..f40d16a 100644
--- a/pecan/decorators.py
+++ b/pecan/decorators.py
@@ -33,9 +33,10 @@ def expose(template=None,
directory.
:param content_type: The content-type to use for this template.
:param generic: A boolean which flags this as a "generic" controller,
- which uses generic functions based upon ``simplegeneric``
- generic functions. Allows you to split a single
- controller into multiple paths based upon HTTP method.
+ which uses generic functions based upon
+ ``functools.singledispatch`` generic functions. Allows you
+ to split a single controller into multiple paths based upon
+ HTTP method.
'''
if template == 'json':
diff --git a/pecan/jsonify.py b/pecan/jsonify.py
index 2d89c53..726213a 100644
--- a/pecan/jsonify.py
+++ b/pecan/jsonify.py
@@ -17,18 +17,24 @@ except ImportError: # pragma no cover
webob_dicts = (MultiDict,)
import six
-from simplegeneric import generic
+try:
+ from functools import singledispatch
+except ImportError: # pragma: no cover
+ from singledispatch import singledispatch
try:
- from sqlalchemy.engine.base import ResultProxy, RowProxy
+ from sqlalchemy.engine.result import ResultProxy, RowProxy
except ImportError: # pragma no cover
- # dummy classes since we don't have SQLAlchemy installed
+ try:
+ from sqlalchemy.engine.base import ResultProxy, RowProxy
+ except ImportError: # pragma no cover
+ # dummy classes since we don't have SQLAlchemy installed
- class ResultProxy: # noqa
- pass
+ class ResultProxy(object): # noqa
+ pass
- class RowProxy: # noqa
- pass
+ class RowProxy(object): # noqa
+ pass
#
@@ -105,11 +111,17 @@ class GenericJSON(JSONEncoder):
else:
return JSONEncoder.default(self, obj)
-
_default = GenericJSON()
-@generic
+def with_when_type(f):
+ # Add some backwards support for simplegeneric's API
+ f.when_type = f.register
+ return f
+
+
+@with_when_type
+@singledispatch
def jsonify(obj):
return _default.default(obj)
diff --git a/requirements.txt b/requirements.txt
index 5146301..9205775 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,4 @@
WebOb>=1.2dev
Mako>=0.4.0
WebTest>=1.3.1
-simplegeneric>=0.8.1
six
diff --git a/setup.py b/setup.py
index efb3454..2d724f6 100644
--- a/setup.py
+++ b/setup.py
@@ -39,10 +39,21 @@ except:
#
requirements.append('argparse')
+try:
+ from functools import singledispatch # noqa
+except:
+ #
+ # This was introduced in Python 3.4 - the singledispatch package contains
+ # a backported replacement for 2.6 through 3.3
+ #
+ requirements.append('singledispatch')
+
+
tests_require = requirements + [
'virtualenv',
'gunicorn',
- 'mock'
+ 'mock',
+ 'sqlalchemy'
]
if sys.version_info < (2, 7):
tests_require += ['unittest2']