diff options
-rw-r--r-- | docs/source/jsonify.rst | 6 | ||||
-rw-r--r-- | pecan/decorators.py | 7 | ||||
-rw-r--r-- | pecan/jsonify.py | 30 | ||||
-rw-r--r-- | requirements.txt | 1 | ||||
-rw-r--r-- | setup.py | 13 |
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 @@ -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'] |