Skip to content
This repository has been archived by the owner on Dec 17, 2020. It is now read-only.

Commit

Permalink
Added initial implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
projekt01 committed Nov 30, 2007
0 parents commit 4768711
Show file tree
Hide file tree
Showing 18 changed files with 1,761 additions and 0 deletions.
8 changes: 8 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
=======
CHANGES
=======

Version 0.5.0 (unreleased)
-------------------------

- Initial Release
4 changes: 4 additions & 0 deletions README.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
This package provides basic JSON components like JSON reader and writer
utilities and a JSON-RPC client proxy including the transport implementation
for Zope3.

8 changes: 8 additions & 0 deletions TODO.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
====
TODO
====

- add tests and use testing stub for fake the JSONRPC server response

- improve coverage, write tests for all untested code, most of this is related
to error handling.
52 changes: 52 additions & 0 deletions bootstrap.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
##############################################################################
#
# Copyright (c) 2007 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Bootstrap a buildout-based project
Simply run this script in a directory containing a buildout.cfg.
The script accepts buildout command-line options, so you can
use the -c option to specify an alternate configuration file.
$Id: bootstrap.py 75940 2007-05-24 14:45:00Z srichter $
"""

import os, shutil, sys, tempfile, urllib2

tmpeggs = tempfile.mkdtemp()

ez = {}
exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py'
).read() in ez
ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)

import pkg_resources

cmd = 'from setuptools.command.easy_install import main; main()'
if sys.platform == 'win32':
cmd = '"%s"' % cmd # work around spawn lamosity on windows

ws = pkg_resources.working_set
assert os.spawnle(
os.P_WAIT, sys.executable, sys.executable,
'-c', cmd, '-mqNxd', tmpeggs, 'zc.buildout',
dict(os.environ,
PYTHONPATH=
ws.find(pkg_resources.Requirement.parse('setuptools')).location
),
) == 0

ws.add_entry(tmpeggs)
ws.require('zc.buildout')
import zc.buildout.buildout
zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap'])
shutil.rmtree(tmpeggs)
15 changes: 15 additions & 0 deletions buildout.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[buildout]
develop = .
parts = test checker coverage

[test]
recipe = zc.recipe.testrunner
eggs = z3c.json [test]

[checker]
recipe = lovely.recipe:importchecker
path = src/z3c/json

[coverage]
recipe = zc.recipe.egg
eggs = z3c.coverage
62 changes: 62 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
##############################################################################
#
# Copyright (c) 2007 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Setup
$Id:$
"""
import os
from setuptools import setup, find_packages

def read(*rnames):
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()

setup (
name='z3c.json',
version='0.5.0dev',
author = "Roger Ineichen and the Zope Community",
author_email = "zope3-dev@zope.org",
description = "Zope3 JSON base libraries used for z3c.jsonpage and z3c.jsonrpc",
long_description=(
read('README.txt')
+ '\n\n' +
read('CHANGES.txt')
),
license = "ZPL 2.1",
keywords = "zope3 z3c json base library",
classifiers = [
'Development Status :: 4 - Beta',
'Environment :: Web Environment',
'Intended Audience :: Developers',
'License :: OSI Approved :: Zope Public License',
'Programming Language :: Python',
'Natural Language :: English',
'Operating System :: OS Independent',
'Topic :: Internet :: WWW/HTTP',
'Framework :: Zope3'],
url = 'http://cheeseshop.python.org/pypi/z3c.json',
packages = find_packages('src'),
include_package_data = True,
package_dir = {'':'src'},
namespace_packages = ['z3c'],
extras_require = dict(
test = [
'z3c.coverage',
'zope.app.testing',],
),
install_requires = [
'setuptools',
'zope.component',
],
zip_safe = False,
)
7 changes: 7 additions & 0 deletions src/z3c/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# this is a namespace package
try:
import pkg_resources
pkg_resources.declare_namespace(__name__)
except ImportError:
import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)
3 changes: 3 additions & 0 deletions src/z3c/json/SETUP.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<data-files zopeskel/etc/package-includes>
z3c.json-*.zcml
</data-files>
1 change: 1 addition & 0 deletions src/z3c/json/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Make a package.
35 changes: 35 additions & 0 deletions src/z3c/json/configure.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
xmlns:i18n="http://namespaces.zope.org/i18n"
i18n_domain="z3c">

<!-- JSON reader and writer utility -->
<utility
factory=".converter.JSONReader"
provides=".interfaces.IJSONReader"
/>

<utility
factory=".converter.JSONWriter"
provides=".interfaces.IJSONWriter"
/>


<!-- marshaller -->
<adapter
for="list"
factory=".converter.ListPreMarshaller"
/>

<adapter
for="tuple"
factory=".converter.ListPreMarshaller"
/>

<adapter
factory=".converter.DictPreMarshaller"
for="dict"
/>

</configure>
112 changes: 112 additions & 0 deletions src/z3c/json/converter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
##############################################################################
#
# Copyright (c) 2007 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""
$Id:$
"""
__docformat__ = "reStructuredText"

import zope.interface

from z3c.json import interfaces
from z3c.json import minjson
from z3c.json import exceptions


try:
import cjson
hasCJson = True
except ImportError:
import logging
logger = logging.getLogger()
logger.log(logging.INFO,
"Using minjson only. cjson is much faster and available at the cheese "
"shop. easy_install python-cjson")
hasCJson = False


class JSONReader(object):
"""JSON reader utility."""
zope.interface.implements(interfaces.IJSONReader)

def read(self, aString, encoding=None):
if hasCJson:
try:
# the True parameter here tells cjson to make all strings
# unicode. This is a good idea here.
return cjson.decode(aString, True)
except cjson.DecodeError:
# fall back to minjson
pass
# This is a fall-back position for less-well-constructed JSON
try:
return minjson.read(aString, encoding)
except minjson.ReadException, e:
raise exceptions.ResponseError(e)


class JSONWriter(object):
"""JSON writer utility."""
zope.interface.implements(interfaces.IJSONWriter)

def write(self, anObject):
if hasCJson:
try:
return unicode(cjson.encode(anObject))
except cjson.EncodeError:
# fall back to minjson
pass
try:
return minjson.write(anObject)
except minjson.WriteException, e:
raise TypeError, e


def premarshal(data):
"""Premarshal data before handing it to JSON writer for marshalling
The initial purpose of this function is to remove security proxies
without resorting to removeSecurityProxy. This way, we can avoid
inadvertently providing access to data that should be protected.
"""
premarshaller = interfaces.IJSONRPCPremarshaller(data, alternate=None)
if premarshaller is not None:
return premarshaller()
return data


class PreMarshallerBase(object):
"""Abstract base class for pre-marshallers."""
zope.interface.implements(interfaces.IJSONRPCPremarshaller)

def __init__(self, data):
self.data = data

def __call__(self):
raise Exception, "Not implemented"


class DictPreMarshaller(PreMarshallerBase):
"""Pre-marshaller for dicts"""

def __call__(self):
return dict([(premarshal(k), premarshal(v))
for (k, v) in self.data.items()])


class ListPreMarshaller(PreMarshallerBase):
"""Pre-marshaller for list"""

def __call__(self):
return map(premarshal, self.data)

Loading

0 comments on commit 4768711

Please sign in to comment.