Ejemplo n.º 1
0
 def setUp(self):
     self.refresh_requests = []
     self.repl = Repl(banner='', config=setup_config(),
                      request_refresh=self.refresh)
     # clear history
     self.repl.rl_history = History()
     self.repl.height, self.repl.width = (5, 32)
Ejemplo n.º 2
0
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:

            reload_requests = []

            def request_reload(desc):
                reload_requests.append(curtsies.events.ReloadEvent([desc]))

            refresh_requests = []

            def request_refresh(when='now'):
                refresh_requests.append(
                    curtsies.events.RefreshRequestEvent(when=when))

            def event_or_refresh(timeout=None):
                while True:
                    t = time.time()
                    refresh_requests.sort(
                        key=lambda r: 0 if r.when == 'now' else r.when)
                    if refresh_requests and (refresh_requests[0].when == 'now'
                                             or refresh_requests[-1].when < t):
                        yield refresh_requests.pop(0)
                    elif reload_requests:
                        e = reload_requests.pop()
                        yield e
                    else:
                        e = input_generator.send(.2)
                        if e is not None:
                            yield e

            global repl  # global for easy introspection `from bpython.curtsies import repl`
            with Repl(config=config,
                      locals_=locals_,
                      request_refresh=request_refresh,
                      request_reload=request_reload,
                      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) 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 paste:
                    process_event(paste)

                process_event(
                    None
                )  #priming the pump (do a display before waiting for first event)
                for _, e in izip(find_iterator, event_or_refresh(0)):
                    if e is not None:
                        process_event(e)
                for e in event_or_refresh():
                    process_event(e)
Ejemplo n.º 3
0
 def setUp(self):
     self.repl = Repl(config=setup_config())
     # clear history
     self.repl.rl_history = History()
     self.repl.height, self.repl.width = (5, 10)
Ejemplo n.º 4
0
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)