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' __version__ = '0.1'
import json
from werkzeug.routing import Map, Rule from werkzeug.routing import Map, Rule
from werkzeug.serving import run_simple from werkzeug.serving import run_simple
from werkzeug.wrappers import Request, Response from werkzeug.wrappers import Request, Response
from werkzeug.exceptions import HTTPException, NotFound, NotImplemented, InternalServerError 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([ url_map = Map([
# moderation panel # moderation panel
Rule('/', endpoint='admin.index', methods=['GET', 'POST']), Rule('/', endpoint='admin.index', methods=['GET', 'POST']),
# comments API # comments API
Rule('/comment/<string:path>/', endpoint='comments.comment', methods=['POST']), Rule('/comment/<string:path>/', endpoint='comment.get'),
Rule('/comment/<string:path>/<int:id>', endpoint='comments.comment', Rule('/comment/<string:path>/new', endpoint='comment.create', methods=['POST']),
methods=['GET', 'PUT', 'DELETE']), 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(): def main():
app = Isso(123) app = Isso({'SQLITE': '/tmp/sqlite.db'})
run_simple('127.0.0.1', 8080, app) 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): def update(self, path, id, comment):
with sqlite3.connect(self.dbpath) as con: 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, con.execute('UPDATE comments SET %s=? WHERE path=? AND id=?;' % field,
(value, id, path)) (value, id, path))

View File

@ -22,7 +22,7 @@ class Comment(object):
for field in self.protected + self.fields: for field in self.protected + self.fields:
self.__dict__[field] = kw.get(field) self.__dict__[field] = kw.get(field)
def iteritems(self, protected=False): def iteritems(self, protected=True):
for field in self.fields: for field in self.fields:
yield field, getattr(self, field) yield field, getattr(self, field)
if protected: if protected:
@ -42,10 +42,6 @@ class Comment(object):
return comment return comment
@property
def json(self):
return ''
@property @property
def pending(self): def pending(self):
return self.mode == 1 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.6",
"Programming Language :: Python :: 2.7" "Programming Language :: Python :: 2.7"
], ],
install_requires=['werkzeug'], install_requires=['werkzeug', 'itsdangerous'],
entry_points={ entry_points={
'console_scripts': 'console_scripts':
['isso = isso:main'], ['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