|
@@ -3,21 +3,31 @@ Test views, per the spec here:
|
|
|
http://www.techempower.com/benchmarks/#section=code&hw=i7&test=json
|
|
|
"""
|
|
|
from operator import itemgetter
|
|
|
-from random import randint
|
|
|
-import sys
|
|
|
+from random import randint, sample
|
|
|
|
|
|
-from pyramid.view import view_config
|
|
|
from pyramid.response import Response
|
|
|
-from frameworkbenchmarks.models import DBSession, World, Fortune
|
|
|
-from sqlalchemy.ext import baked
|
|
|
+from pyramid.view import view_config
|
|
|
+from sqlalchemy import select
|
|
|
+from sqlalchemy.orm.attributes import flag_modified
|
|
|
|
|
|
-if sys.version_info[0] == 3:
|
|
|
- xrange = range
|
|
|
+from frameworkbenchmarks.models import Fortune, World
|
|
|
|
|
|
-bakery = baked.bakery()
|
|
|
+
|
|
|
+def parse_query(request):
|
|
|
+ queries = request.GET.get("queries", 1)
|
|
|
+ try:
|
|
|
+ queries = int(queries)
|
|
|
+ except ValueError:
|
|
|
+ queries = 1
|
|
|
+ else:
|
|
|
+ if queries < 1:
|
|
|
+ queries = 1
|
|
|
+ elif queries > 500:
|
|
|
+ queries = 500
|
|
|
+ return queries
|
|
|
|
|
|
|
|
|
-@view_config(route_name='test_1', renderer='json')
|
|
|
+@view_config(route_name="test_1", renderer="json")
|
|
|
def test_1(request):
|
|
|
"""
|
|
|
Test type 1: JSON serialization
|
|
@@ -25,87 +35,67 @@ def test_1(request):
|
|
|
return {"message": "Hello, World!"}
|
|
|
|
|
|
|
|
|
-@view_config(route_name='test_2', renderer='json')
|
|
|
+@view_config(route_name="test_2", renderer="json")
|
|
|
def test_2(request):
|
|
|
"""
|
|
|
Test type 2: Single database query
|
|
|
"""
|
|
|
num = randint(1, 10000)
|
|
|
- baked_query = bakery(lambda session: session.query(World))
|
|
|
- result = baked_query(DBSession).get(num)
|
|
|
+ result = request.dbsession.get(World, num)
|
|
|
return result.__json__()
|
|
|
|
|
|
|
|
|
-@view_config(route_name='test_3', renderer='json')
|
|
|
+@view_config(route_name="test_3", renderer="json")
|
|
|
def test_3(request):
|
|
|
"""
|
|
|
Test type 3: Multiple database queries
|
|
|
"""
|
|
|
- queries = request.GET.get('queries', 1)
|
|
|
- try:
|
|
|
- queries = int(queries)
|
|
|
- except ValueError:
|
|
|
- queries = 1
|
|
|
- else:
|
|
|
- if queries < 1:
|
|
|
- queries = 1
|
|
|
- elif queries > 500:
|
|
|
- queries = 500
|
|
|
- baked_query = bakery(lambda session: session.query(World))
|
|
|
+ queries = parse_query(request)
|
|
|
result = [
|
|
|
- baked_query(DBSession).get(num).__json__()
|
|
|
- for num in (randint(1, 10000) for _ in xrange(queries))
|
|
|
+ request.dbsession.get(World, num).__json__()
|
|
|
+ for num in sample(range(1, 10001), queries)
|
|
|
]
|
|
|
return result
|
|
|
|
|
|
|
|
|
-@view_config(route_name='test_4', renderer='templates/test_4.pt')
|
|
|
+@view_config(route_name="test_4", renderer="templates/test_4.pt")
|
|
|
def test_4(request):
|
|
|
"""
|
|
|
Test type 4: Fortunes
|
|
|
"""
|
|
|
- baked_query = bakery(lambda session: session.query(Fortune))
|
|
|
-
|
|
|
- fortunes = [obj.__json__() for obj in baked_query(DBSession).all()]
|
|
|
- fortunes.append(
|
|
|
- {"id": 0, "message": "Additional fortune added at request time."}
|
|
|
+ fortunes = (
|
|
|
+ request.dbsession.execute(select(Fortune.id, Fortune.message)).mappings().all()
|
|
|
)
|
|
|
- fortunes.sort(key=itemgetter('message'))
|
|
|
- return {'fortunes': fortunes}
|
|
|
+ fortunes.append({"id": 0, "message": "Additional fortune added at request time."})
|
|
|
+ fortunes.sort(key=itemgetter("message"))
|
|
|
+ return {"fortunes": fortunes}
|
|
|
|
|
|
|
|
|
-@view_config(route_name='test_5', renderer='json')
|
|
|
+@view_config(route_name="test_5", renderer="json")
|
|
|
def test_5(request):
|
|
|
"""
|
|
|
Test type 5: Database updates
|
|
|
"""
|
|
|
- queries = request.GET.get('queries', 1)
|
|
|
- try:
|
|
|
- queries = int(queries)
|
|
|
- except ValueError:
|
|
|
- queries = 1
|
|
|
- else:
|
|
|
- if queries < 1:
|
|
|
- queries = 1
|
|
|
- elif queries > 500:
|
|
|
- queries = 500
|
|
|
- baked_query = bakery(lambda session: session.query(World))
|
|
|
+ queries = parse_query(request)
|
|
|
resultset = []
|
|
|
- for num in sorted(randint(1, 10000) for _ in xrange(queries)):
|
|
|
- obj = baked_query(DBSession).get(num)
|
|
|
+ sess = request.dbsession
|
|
|
+ for num in sample(range(1, 10001), queries):
|
|
|
+ obj = sess.get(World, num)
|
|
|
obj.randomNumber = randint(1, 10000)
|
|
|
+ # force sqlalchemy to UPDATE entry even if the value has not changed
|
|
|
+ # doesn't make sense in a real application, added only for pass `tfb verify`
|
|
|
+ flag_modified(obj, "randomNumber")
|
|
|
resultset.append(obj.__json__())
|
|
|
- DBSession.commit()
|
|
|
+ sess.commit()
|
|
|
return resultset
|
|
|
|
|
|
|
|
|
-@view_config(route_name='test_6')
|
|
|
+@view_config(route_name="test_6")
|
|
|
def test_6(request):
|
|
|
"""
|
|
|
Test type 6: Plaintext
|
|
|
"""
|
|
|
response = Response(
|
|
|
- body=b'Hello, World!',
|
|
|
- content_type='text/plain',
|
|
|
- )
|
|
|
+ body=b"Hello, World!", content_type="text/plain", charset="utf-8"
|
|
|
+ )
|
|
|
return response
|