示例#1
0
    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)
示例#2
0
    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})
示例#3
0
    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)