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'
|
||||
|
||||
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
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):
|
||||
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))
|
||||
|
||||
|
@ -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
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.7"
|
||||
],
|
||||
install_requires=['werkzeug'],
|
||||
install_requires=['werkzeug', 'itsdangerous'],
|
||||
entry_points={
|
||||
'console_scripts':
|
||||
['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