def test_int_to_Integer(): assert int_to_Integer("1 + 2.2 + 0x3 + 40") == \ 'Integer (1 )+2.2 +Integer (0x3 )+Integer (40 )' assert int_to_Integer("0b101") == 'Integer (0b101 )' assert int_to_Integer("ab1 + 1 + '1 + 2'") == "ab1 +Integer (1 )+'1 + 2'" assert int_to_Integer("(2 + \n3)") == '(Integer (2 )+\nInteger (3 ))' assert int_to_Integer( "2 + 2.0 + 2j + 2e-10") == 'Integer (2 )+2.0 +2j +2e-10 '
def test_int_to_Integer(): assert int_to_Integer("1 + 2.2 + 0x3 + 40") == \ 'Integer (1 )+2.2 +Integer (0x3 )+Integer (40 )' if sys.version_info[0] == 2: assert int_to_Integer("1l") == 'Integer (1l )' assert int_to_Integer("0b101") == 'Integer (0b101 )' assert int_to_Integer("ab1 + 1 + '1 + 2'") == "ab1 +Integer (1 )+'1 + 2'" assert int_to_Integer("(2 + \n3)") == '(Integer (2 )+\nInteger (3 ))' assert int_to_Integer("2 + 2.0 + 2j + 2e-10") == 'Integer (2 )+2.0 +2j +2e-10 '
def test_int_to_Integer(): assert (int_to_Integer("1 + 2.2 + 0x3 + 40") == "Integer (1 )+2.2 +Integer (0x3 )+Integer (40 )") if sys.version_info[0] == 2: assert int_to_Integer("1l") == "Integer (1l )" assert int_to_Integer("0b101") == "Integer (0b101 )" assert int_to_Integer("ab1 + 1 + '1 + 2'") == "ab1 +Integer (1 )+'1 + 2'" assert int_to_Integer("(2 + \n3)") == "(Integer (2 )+\nInteger (3 ))" assert int_to_Integer( "2 + 2.0 + 2j + 2e-10") == "Integer (2 )+2.0 +2j +2e-10 "
def test_int_to_Integer(): assert int_to_Integer("1 + 2.2 + 0x3 + 40") == \ 'Integer (1 )+2.2 +Integer (0x3 )+Integer (40 )' if sys.version_info[0] == 2: assert int_to_Integer("1l") == 'Integer (1l )' if sys.version_info[1] > 5 or sys.version_info[0] == 3: # Binary literals were added in Python 2.6 assert int_to_Integer("0b101") == 'Integer (0b101 )' assert int_to_Integer("ab1 + 1 + '1 + 2'") == "ab1 +Integer (1 )+'1 + 2'" assert int_to_Integer("(2 + \n3)") == '(Integer (2 )+\nInteger (3 ))' assert int_to_Integer("2 + 2.0 + 2j + 2e-10") == 'Integer (2 )+2.0 +2j +2e-10 '
def test_int_to_Integer(): assert int_to_Integer("1 + 2.2 + 0x3 + 40") == \ 'Integer (1 )+2.2 +Integer (0x3 )+Integer (40 )' if sys.version_info[0] == 2: assert int_to_Integer("1l") == 'Integer (1l )' if sys.version_info[1] > 5 or sys.version_info[0] == 3: # Binary literals were added in Python 2.6 assert int_to_Integer("0b101") == 'Integer (0b101 )' assert int_to_Integer("ab1 + 1 + '1 + 2'") == "ab1 +Integer (1 )+'1 + 2'" assert int_to_Integer("(2 + \n3)") == '(Integer (2 )+\nInteger (3 ))' assert int_to_Integer( "2 + 2.0 + 2j + 2e-10") == 'Integer (2 )+2.0 +2j +2e-10 '
def evaluate(self, statement, session, printer=None, stream=None): """Evaluate the statement in sessions's globals. """ # the Python compiler doesn't like network line endings source = statement.replace('\r\n', '\n').rstrip() try: # check for a SyntaxError now; this way the user will see their # original statement and not the transformed one ast.parse(source) except SyntaxError: return self.error(stream, self.syntaxerror()) # convert int to Integer (1/2 -> Integer(1)/Integer(2)) source = int_to_Integer(source) # split source code into 'exec' and 'eval' parts exec_source, eval_source = self.split(source) try: self.compile(eval_source, 'eval') except (OverflowError, SyntaxError, ValueError): exec_source, eval_source = source, None if exec_source is not None: exec_source += '\n' if eval_source is not None: eval_source += '\n' # create a dedicated module to be used as this statement's __main__ statement_module = new.module('__main__') # use this request's __builtin__, since it changes on each request. # this is needed for import statements, among other things. import __builtin__ statement_module.__builtin__ = __builtin__ # create customized display hook stringify_func = printer or sstr def displayhook(arg): if arg is not None: __builtin__._ = None print stringify_func(arg) __builtin__._ = arg old_displayhook = sys.displayhook sys.displayhook = displayhook # swap in our custom module for __main__. then unpickle the session # globals, run the statement, and re-pickle the session globals, all # inside it. old_main = sys.modules.get('__main__') try: old_globals = {} sys.modules['__main__'] = statement_module statement_module.__name__ = '__main__' # re-evaluate the unpicklables for code in session.unpicklables: exec code in statement_module.__dict__ exec code in old_globals # re-initialize the globals session_globals_dict = session.globals_dict() for name, val in session_globals_dict.items(): try: statement_module.__dict__[name] = val old_globals[name] = val except: session.remove_global(name) # re-initialize '_' special variable __builtin__._ = session_globals_dict.get('_') # run! offset = 0 try: old_stdout = sys.stdout old_stderr = sys.stderr try: if stream is not None: sys.stdout = stream sys.stderr = stream if exec_source is not None: try: exec_code = self.compile(exec_source, 'exec') except (OverflowError, SyntaxError, ValueError): return self.error(stream, self.syntaxerror()) eval(exec_code, statement_module.__dict__) if eval_source is not None: if exec_source is not None: offset = len(exec_source.split('\n')) result = eval(eval_source, statement_module.__dict__) sys.displayhook(result) finally: sys.stdout = old_stdout sys.stderr = old_stderr except DeadlineExceededError: logging.debug("is deadlineexceedederror in evaluate") raise DeadlineExceededError except: return self.error(stream, self.traceback(offset)) # extract the new globals that this statement added new_globals = {} for name, val in statement_module.__dict__.items(): if name not in old_globals or val != old_globals[name]: new_globals[name] = val for name in old_globals: if name not in statement_module.__dict__: session.remove_global(name) if True in [ isinstance(val, UNPICKLABLE_TYPES) for val in new_globals.values() ]: # this statement added an unpicklable global. store the statement and # the names of all of the globals it added in the unpicklables source = "" if exec_source: source += exec_source if eval_source: source += eval_source source += "\n" session.add_unpicklable(source, new_globals.keys()) logging.debug('Storing this statement as an unpicklable.') else: # this statement didn't add any unpicklables. pickle and store the # new globals back into the datastore for name, val in new_globals.items(): if not name.startswith('__'): try: session.set_global(name, val) except (TypeError, pickle.PicklingError): pass # save '_' special variable into the datastore val = getattr(__builtin__, '_', None) try: session.set_global('_', val) except (TypeError, pickle.PicklingError): session.set_global('_', None) finally: sys.modules['__main__'] = old_main sys.displayhook = old_displayhook try: del __builtin__._ except AttributeError: pass try: session.put() except RequestTooLargeError: stream.truncate(0) # clear output self.error( stream, ('Unable to process statement due to its excessive size.', ))
def evaluate(self, statement, session, printer=None, stream=None): """Evaluate the statement in sessions's globals. """ # the Python compiler doesn't like network line endings source = statement.replace('\r\n', '\n').rstrip() try: # check for a SyntaxError now; this way the user will see their # original statement and not the transformed one ast.parse(source) except SyntaxError: return self.error(stream, self.syntaxerror()) # convert int to Integer (1/2 -> Integer(1)/Integer(2)) source = int_to_Integer(source) # split source code into 'exec' and 'eval' parts exec_source, eval_source = self.split(source) try: self.compile(eval_source, 'eval') except (OverflowError, SyntaxError, ValueError): exec_source, eval_source = source, None if exec_source is not None: exec_source += '\n' if eval_source is not None: eval_source += '\n' # create a dedicated module to be used as this statement's __main__ statement_module = new.module('__main__') # use this request's __builtin__, since it changes on each request. # this is needed for import statements, among other things. import __builtin__ statement_module.__builtin__ = __builtin__ # create customized display hook stringify_func = printer or sstr def displayhook(arg): if arg is not None: __builtin__._ = None print stringify_func(arg) __builtin__._ = arg old_displayhook = sys.displayhook sys.displayhook = displayhook # swap in our custom module for __main__. then unpickle the session # globals, run the statement, and re-pickle the session globals, all # inside it. old_main = sys.modules.get('__main__') try: old_globals = {} sys.modules['__main__'] = statement_module statement_module.__name__ = '__main__' # re-evaluate the unpicklables for code in session.unpicklables: exec code in statement_module.__dict__ exec code in old_globals # re-initialize the globals session_globals_dict = session.globals_dict() for name, val in session_globals_dict.items(): try: statement_module.__dict__[name] = val old_globals[name] = val except: session.remove_global(name) # re-initialize '_' special variable __builtin__._ = session_globals_dict.get('_') # run! offset = 0 try: old_stdout = sys.stdout old_stderr = sys.stderr try: if stream is not None: sys.stdout = stream sys.stderr = stream if exec_source is not None: try: exec_code = self.compile(exec_source, 'exec') except (OverflowError, SyntaxError, ValueError): return self.error(stream, self.syntaxerror()) eval(exec_code, statement_module.__dict__) if eval_source is not None: if exec_source is not None: offset = len(exec_source.split('\n')) result = eval(eval_source, statement_module.__dict__) sys.displayhook(result) finally: sys.stdout = old_stdout sys.stderr = old_stderr except DeadlineExceededError: logging.debug("is deadlineexceedederror in evaluate") raise DeadlineExceededError except: return self.error(stream, self.traceback(offset)) # extract the new globals that this statement added new_globals = {} for name, val in statement_module.__dict__.items(): if name not in old_globals or val != old_globals[name]: new_globals[name] = val for name in old_globals: if name not in statement_module.__dict__: session.remove_global(name) if True in [isinstance(val, UNPICKLABLE_TYPES) for val in new_globals.values()]: # this statement added an unpicklable global. store the statement and # the names of all of the globals it added in the unpicklables source = "" if exec_source: source += exec_source if eval_source: source += eval_source source += "\n" session.add_unpicklable(source, new_globals.keys()) logging.debug('Storing this statement as an unpicklable.') else: # this statement didn't add any unpicklables. pickle and store the # new globals back into the datastore for name, val in new_globals.items(): if not name.startswith('__'): try: session.set_global(name, val) except (TypeError, pickle.PicklingError): pass # save '_' special variable into the datastore val = getattr(__builtin__, '_', None) try: session.set_global('_', val) except (TypeError, pickle.PicklingError): session.set_global('_', None) finally: sys.modules['__main__'] = old_main sys.displayhook = old_displayhook try: del __builtin__._ except AttributeError: pass try: session.put() except RequestTooLargeError: stream.truncate(0) # clear output self.error(stream, ('Unable to process statement due to its excessive size.',))