def pop_queue(self): if self.commandbusy: self.log.warning('pop_queue called when already busy!') return if not self.queue: self.log.warning('pop_queue called when already empty!') return (cmdobj, connid, twwcid, queuetime) = self.queue.pop(0) task = two.task.Task(self, cmdobj, connid, twwcid, queuetime) self.commandbusy = True EvalPropContext.context_stack.clear() # Handle the command. try: yield task.handle() except Exception as ex: self.log.error('Error handling task: %s', cmdobj, exc_info=True) # Resolve all changes resulting from the command. We do this # in a separate try block, so that if the command died partway, # we still display the partial effects. if task.is_writable(): try: task.resetticks() yield task.resolve() except Exception as ex: self.log.error('Error resolving task: %s', cmdobj, exc_info=True) if EvalPropContext.context_stack: self.log.error('EvalPropContext.context_stack has %d entries remaining at end of task!', len(EvalPropContext.context_stack)) task.resetticks() starttime = task.starttime endtime = twcommon.misc.now() self.log.info('Finished command in %.3f ms (queued for %.3f ms); %d ticks max, %d ticks total', (endtime-starttime).total_seconds() * 1000, (starttime-queuetime).total_seconds() * 1000, task.maxcputicks, task.totalcputicks) self.commandbusy = False task.close() # Keep popping, if the queue is nonempty. if self.queue: self.ioloop.add_callback(self.pop_queue)
def test_comprehensions(self): yield self.resetTables() task = two.task.Task(self.app, None, 1, 2, twcommon.misc.now()) ctx = EvalPropContext(task, loctx=self.loctx, level=LEVEL_EXECUTE) res = yield ctx.eval('[_x+1 for _x in ls]', evaltype=EVALTYPE_CODE) self.assertEqual(res, [2,3,4]) res = yield ctx.eval('[_x+1 for _x in [0,1,2,3] if _x != 2]', evaltype=EVALTYPE_CODE) self.assertEqual(res, [1,2,4]) res = yield ctx.eval('[_x+_y for _x in [0,1,2,3] for _y in [5,6,7]]', evaltype=EVALTYPE_CODE) self.assertEqual(res, [5, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, 10]) res = yield ctx.eval('[_x+_y for _x in [0,1,2,3] if _x%2 for _y in [5,6,7]]', evaltype=EVALTYPE_CODE) self.assertEqual(res, [6, 7, 8, 8, 9, 10]) res = yield ctx.eval('[_x+_y for _x in [0,1,2,3] for _y in [5,6,7] if _x%2]', evaltype=EVALTYPE_CODE) self.assertEqual(res, [6, 7, 8, 8, 9, 10]) res = yield ctx.eval('[_x+_y for _x in [0,1,2,3] if _x%2 for _y in [5,6,7] if _y==6]', evaltype=EVALTYPE_CODE) self.assertEqual(res, [7,9]) res = yield ctx.eval('[(_y,_x) for _x,_y in ["XY", (7,8), (9,10)]]', evaltype=EVALTYPE_CODE) self.assertEqual(res, [('Y','X'), (8,7), (10,9)]) task.resetticks() res = yield ctx.eval('{_x for _x in ls}', evaltype=EVALTYPE_CODE) self.assertEqual(res, {1,2,3}) res = yield ctx.eval('{_x|1 for _x in ls}', evaltype=EVALTYPE_CODE) self.assertEqual(res, {1,3}) res = yield ctx.eval('{_x for _x in [1,2,3,4,1] if _x%2}', evaltype=EVALTYPE_CODE) self.assertEqual(res, {1,3}) res = yield ctx.eval('{_x+_y for _x in [0,1,2,3] for _y in [5,6,7]}', evaltype=EVALTYPE_CODE) self.assertEqual(res, {5, 6, 7, 8, 9, 10}) res = yield ctx.eval('{_x:11 for _x in ls}', evaltype=EVALTYPE_CODE) self.assertEqual(res, {1:11, 2:11, 3:11}) res = yield ctx.eval('{_x:_x+1 for _x in ls if _x==3}', evaltype=EVALTYPE_CODE) self.assertEqual(res, {3:4}) res = yield ctx.eval('{(_x,_y):(_x+_y) for _x in [1,2] for _y in [5,6,7]}', evaltype=EVALTYPE_CODE) self.assertEqual(res, {(2,7): 9, (1,5): 6, (2,6): 8, (1,6): 7, (1,7): 8, (2,5): 7})
def test_type_methods_list(self): yield self.resetTables() task = two.task.Task(self.app, None, 1, 2, twcommon.misc.now()) ctx = EvalPropContext(task, loctx=self.loctx, level=LEVEL_EXECUTE) res = yield ctx.eval('_ls=[1,2,3]\n_ls.append(4);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [1,2,3,4]) res = yield ctx.eval('_ls=[1,2,3]\n_ls.clear();_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, []) res = yield ctx.eval('_ls=[1,2,3]\n_ls2=_ls.copy();_ls[0]=0;_ls2', evaltype=EVALTYPE_CODE) self.assertEqual(res, [1,2,3]) res = yield ctx.eval('[1,2,3,2].count(2)', evaltype=EVALTYPE_CODE) self.assertEqual(res, 2) res = yield ctx.eval('_ls=[1,2,3]\n_ls.extend([4,5]);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [1,2,3,4,5]) res = yield ctx.eval('[5,4,3].index(4)', evaltype=EVALTYPE_CODE) self.assertEqual(res, 1) res = yield ctx.eval('_ls=[1,2,3]\n_ls.insert(0,4);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [4,1,2,3]) res = yield ctx.eval('_ls=[1,2,3]\n_ls.pop();_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [1,2]) res = yield ctx.eval('_ls=[1,2,3]\n_ls.remove(2);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [1,3]) res = yield ctx.eval('_ls=[3,2,1]\n_ls.reverse();_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [1,2,3]) task.resetticks() res = yield ctx.eval('_ls=[3,1,2]\n_ls.sort();_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [1,2,3]) res = yield ctx.eval('_ls=[3,1,2]\nlist.sort(_ls);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [1,2,3]) res = yield ctx.eval('_ls=[3,1,2]\n_ls.sort(reverse=True);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [3,2,1]) res = yield ctx.eval('_ls=[3,1,2]\nlist.sort(_ls,reverse=True);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [3,2,1]) res = yield ctx.eval('_ls=[-1,2,-3,4]\n_ls.sort(key=str);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [-1,-3,2,4]) res = yield ctx.eval('_ls=[-1,2,-3,4]\nlist.sort(_ls,key=str);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [-1,-3,2,4]) res = yield ctx.eval('_ls=[-1,2,-3,4]\n_ls.sort(key=str,reverse=True);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [4,2,-3,-1]) res = yield ctx.eval('_ls=[-1,2,-3,4]\nlist.sort(_ls,key=str,reverse=True);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [4,2,-3,-1]) res = yield ctx.eval('_ls=[-1,-3,2,4]\n_func=code("x*x",args="x")\n_ls.sort(key=_func);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [-1,2,-3,4]) res = yield ctx.eval('_ls=[-1,-3,2,4]\n_func=code("x*x",args="x")\nlist.sort(_ls,key=_func);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [-1,2,-3,4]) res = yield ctx.eval('_ls=[-1,-3,2,4]\n_func=code("x*x",args="x")\n_ls.sort(key=_func,reverse=True);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [4,-3,2,-1]) res = yield ctx.eval('_ls=[-1,-3,2,4]\n_func=code("x*x",args="x")\nlist.sort(_ls,key=_func,reverse=True);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, [4,-3,2,-1]) res = yield ctx.eval('_ls=["d","C","b","A"]\n_ls.sort(key=str.upper);_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, ['A','b','C','d']) res = yield ctx.eval('_ls=["d","p","q","x","y"]\n_ls.sort(key=functools.partial(str.index,"xyzpdq"));_ls', evaltype=EVALTYPE_CODE) self.assertEqual(res, ['x','y','p','d','q']) with self.assertRaises(TypeError): res = yield ctx.eval('_ls=[1]\n_ls.sort(key=foo);_ls', locals={'foo':open}, evaltype=EVALTYPE_CODE) with self.assertRaises(TypeError): res = yield ctx.eval('_ls=[1]\n_ls.sort(key=foo);_ls', locals={'foo':123}, evaltype=EVALTYPE_CODE)