def mainloop(self, interactive=True, paste=None): if interactive: # Add custom help command # TODO: add methods to run the code self.initialize_interp() # run startup file self.process_event(bpythonevents.RunStartupFileEvent()) # handle paste if paste: self.process_event(paste) # do a display before waiting for first event self.process_event_and_paint(None) inputs = combined_events(self.input_generator) for unused in find_iterator: e = inputs.send(0) if e is not None: self.process_event_and_paint(e) for e in inputs: self.process_event_and_paint(e)
def test_startup_event_latin1(self): with tempfile.NamedTemporaryFile() as temp: self.write_startup_file(temp.name, 'latin-1') with mock.patch.dict('os.environ', {'PYTHONSTARTUP': temp.name}): self.repl.process_event(bpythonevents.RunStartupFileEvent()) self.assertIn('a', self.repl.interp.locals)
def test_startup_event_utf8(self): with tempfile.NamedTemporaryFile() as temp: self.write_startup_file(temp.name, "utf-8") with mock.patch.dict("os.environ", {"PYTHONSTARTUP": temp.name}): self.repl.process_event(bpythonevents.RunStartupFileEvent()) self.assertIn("a", self.repl.interp.locals)
def mainloop(config, locals_, banner, interp=None, paste=None, interactive=True): with curtsies.input.Input(keynames='curtsies', sigint_event=True) as \ input_generator: with curtsies.window.CursorAwareWindow( sys.stdout, sys.stdin, keep_last_line=True, hide_cursor=False, extra_bytes_callback=input_generator.unget_bytes) as window: request_refresh = input_generator.event_trigger( bpythonevents.RefreshRequestEvent) schedule_refresh = input_generator.scheduled_event_trigger( bpythonevents.ScheduledRefreshRequestEvent) request_reload = input_generator.threadsafe_event_trigger( bpythonevents.ReloadEvent) interrupting_refresh = input_generator.threadsafe_event_trigger( lambda: None) request_undo = input_generator.event_trigger( bpythonevents.UndoEvent) def on_suspend(): window.__exit__(None, None, None) input_generator.__exit__(None, None, None) def after_suspend(): input_generator.__enter__() window.__enter__() interrupting_refresh() # global for easy introspection `from bpython.curtsies import repl` global repl with Repl(config=config, locals_=locals_, request_refresh=request_refresh, schedule_refresh=schedule_refresh, request_reload=request_reload, request_undo=request_undo, get_term_hw=window.get_term_hw, get_cursor_vertical_diff=window.get_cursor_vertical_diff, banner=banner, interp=interp, interactive=interactive, orig_tcattrs=input_generator.original_stty, on_suspend=on_suspend, after_suspend=after_suspend) as repl: repl.height, repl.width = window.t.height, window.t.width def process_event(e): """If None is passed in, just paint the screen""" try: if e is not None: repl.process_event(e) except (SystemExitFromCodeGreenlet, SystemExit) as err: array, cursor_pos = repl.paint( about_to_exit=True, user_quit=isinstance(err, SystemExitFromCodeGreenlet)) scrolled = window.render_to_terminal(array, cursor_pos) repl.scroll_offset += scrolled raise else: array, cursor_pos = repl.paint() scrolled = window.render_to_terminal(array, cursor_pos) repl.scroll_offset += scrolled if interactive: # Add custom help command # TODO: add methods to run the code repl.coderunner.interp.locals['_repl'] = repl repl.coderunner.interp.runsource( 'from bpython.curtsiesfrontend._internal ' 'import _Helper') repl.coderunner.interp.runsource('help = _Helper(_repl)\n') del repl.coderunner.interp.locals['_repl'] del repl.coderunner.interp.locals['_Helper'] # run startup file process_event(bpythonevents.RunStartupFileEvent()) # handle paste if paste: process_event(paste) # do a display before waiting for first event process_event(None) for unused in find_iterator: e = input_generator.send(0) if e is not None: process_event(e) for e in input_generator: process_event(e)