clean json fuckup and add create and get views

This commit is contained in:
posativ 2012-10-16 22:49:43 +02:00
parent 8301f0af78
commit 5d23bff409
8 changed files with 119 additions and 19 deletions

View File

@ -21,21 +21,30 @@
__version__ = '0.1'
import json
from werkzeug.routing import Map, Rule
from werkzeug.serving import run_simple
from werkzeug.wrappers import Request, Response
from werkzeug.exceptions import HTTPException, NotFound, NotImplemented, InternalServerError
from isso import admin, comments, db
from isso import admin, comment, db, utils
_dumps = json.dumps
setattr(json, 'dumps', lambda obj: _dumps(obj, cls=utils.IssoEncoder))
url_map = Map([
# moderation panel
Rule('/', endpoint='admin.index', methods=['GET', 'POST']),
# comments API
Rule('/comment/<string:path>/', endpoint='comments.comment', methods=['POST']),
Rule('/comment/<string:path>/<int:id>', endpoint='comments.comment',
methods=['GET', 'PUT', 'DELETE']),
Rule('/comment/<string:path>/', endpoint='comment.get'),
Rule('/comment/<string:path>/new', endpoint='comment.create', methods=['POST']),
Rule('/comment/<string:path>/<int:id>', endpoint='comment.get'),
Rule('/comment/<string:path>/<int:id>', endpoint='comment.modify',
methods=['PUT', 'DELETE']),
])
@ -70,5 +79,5 @@ class Isso:
def main():
app = Isso(123)
app = Isso({'SQLITE': '/tmp/sqlite.db'})
run_simple('127.0.0.1', 8080, app)

21
isso/comment.py Normal file
View File

@ -0,0 +1,21 @@
from werkzeug.wrappers import Response
from werkzeug.exceptions import abort
from isso import json, models
def create(app, environ, request, path):
try:
rv = app.db.add(path, models.Comment.fromjson(request.data))
except ValueError as e:
return Response(unicode(e), 400)
return Response(json.dumps(app.db.get(*rv)), 201, content_type='application/json')
def get(app, environ, request, path, id=None):
rv = list(app.db.retrieve(path)) if id is None else app.db.get(path, id)
return Response(json.dumps(rv), 200, content_type='application/json')

View File

@ -1,7 +0,0 @@
from werkzeug.wrappers import Response
from werkzeug.exceptions import abort
def comment(app, environ, request, path, id=None):
return Response('', 200)

View File

@ -90,7 +90,7 @@ class SQLite(Abstract):
def update(self, path, id, comment):
with sqlite3.connect(self.dbpath) as con:
for field, value in comment.iteritems():
for field, value in comment.iteritems(False):
con.execute('UPDATE comments SET %s=? WHERE path=? AND id=?;' % field,
(value, id, path))

View File

@ -22,7 +22,7 @@ class Comment(object):
for field in self.protected + self.fields:
self.__dict__[field] = kw.get(field)
def iteritems(self, protected=False):
def iteritems(self, protected=True):
for field in self.fields:
yield field, getattr(self, field)
if protected:
@ -42,10 +42,6 @@ class Comment(object):
return comment
@property
def json(self):
return ''
@property
def pending(self):
return self.mode == 1

22
isso/utils.py Normal file
View File

@ -0,0 +1,22 @@
import json
from isso.models import Comment
# def prove(f):
# def dec(app, env, req, *args, **kwargs):
# pass
# def sign(response):
# pass
class IssoEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Comment):
return dict((field, value) for field, value in obj.iteritems())
return json.JSONEncoder.default(self, obj)

View File

@ -28,7 +28,7 @@ setup(
"Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7"
],
install_requires=['werkzeug'],
install_requires=['werkzeug', 'itsdangerous'],
entry_points={
'console_scripts':
['isso = isso:main'],

59
specs/test_comment.py Normal file
View File

@ -0,0 +1,59 @@
import tempfile
import unittest
from werkzeug.test import Client
from werkzeug.wrappers import Response
from isso import Isso, json
from isso.models import Comment
def comment(**kw):
return Comment.fromjson(json.dumps(kw))
class TestComments(unittest.TestCase):
get = lambda self, *x, **z: Client(self.app, Response).get(*x, **z)
put = lambda self, *x, **z: Client(self.app, Response).put(*x, **z)
post = lambda self, *x, **z: Client(self.app, Response).post(*x, **z)
def setUp(self):
fd, self.path = tempfile.mkstemp()
self.app = Isso({'SQLITE': self.path})
def testGet(self):
self.post('/comment/path/new', data=json.dumps(comment(text='Lorem ipsum ...')))
r = self.get('/comment/path/1')
assert r.status_code == 200
rv = json.loads(r.data)
assert rv['id'] == 1
assert rv['text'] == 'Lorem ipsum ...'
def testCreate(self):
rv = self.post('/comment/path/new', data=json.dumps(comment(text='Lorem ipsum ...')))
assert rv.status_code == 201
# XXX assert cookie
c = Comment.fromjson(rv.data)
assert not c.pending
assert not c.deleted
assert c.text == 'Lorem ipsum ...'
def testCreateAndGetMultiple(self):
for i in range(100):
self.post('/comment/path/new', data=json.dumps(comment(text='Spam')))
r = self.get('/comment/path/')
assert r.status_code == 200
rv = json.loads(r.data)
assert len(rv) == 20