clean json fuckup and add create and get views
This commit is contained in:
parent
8301f0af78
commit
5d23bff409
@ -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
21
isso/comment.py
Normal 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')
|
@ -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)
|
|
@ -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))
|
||||||
|
|
||||||
|
@ -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
22
isso/utils.py
Normal 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)
|
2
setup.py
2
setup.py
@ -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
59
specs/test_comment.py
Normal 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
|
Loading…
Reference in New Issue
Block a user