def __init__(self, ps1='>>> ', ps2='... ', show_js=False, libdir=None): Thread.__init__(self, name='RapydScriptREPL') self.to_python = to_python self.JSError = JSError self.enc = getattr(sys.stdin, 'encoding', None) or 'utf-8' try: import readline self.readline = readline except ImportError: pass self.output = ANSIStream(sys.stdout) self.to_repl = Queue() self.from_repl = Queue() self.ps1, self.ps2 = ps1, ps2 self.show_js, self.libdir = show_js, libdir self.prompt = '' self.completions = None self.start()
def __init__(self, ps1=">>> ", ps2="... ", show_js=False, libdir=None): Thread.__init__(self, name="RapydScriptREPL") self.to_python = to_python self.JSError = JSError self.enc = getattr(sys.stdin, "encoding", None) or "utf-8" try: import readline self.readline = readline except ImportError: pass self.output = ANSIStream(sys.stdout) self.to_repl = Queue() self.from_repl = Queue() self.ps1, self.ps2 = ps1, ps2 self.show_js, self.libdir = show_js, libdir self.prompt = "" self.completions = None self.start()
class Repl(Thread): LINE_CONTINUATION_CHARS = r'\:' daemon = True def __init__(self, ps1='>>> ', ps2='... ', show_js=False, libdir=None): Thread.__init__(self, name='RapydScriptREPL') self.to_python = to_python self.JSError = JSError self.enc = getattr(sys.stdin, 'encoding', None) or 'utf-8' try: import readline self.readline = readline except ImportError: pass self.output = ANSIStream(sys.stdout) self.to_repl = Queue() self.from_repl = Queue() self.ps1, self.ps2 = ps1, ps2 self.show_js, self.libdir = show_js, libdir self.prompt = '' self.completions = None self.start() def init_ctx(self): self.prompt = self.ps1 self.ctx = compiler() self.ctx.g.Duktape.write = self.output.write self.ctx.eval(r'''console = { log: function() { Duktape.write(Array.prototype.slice.call(arguments).join(' ') + '\n');}}; console['error'] = console['log'];''') self.ctx.g.repl_options = { 'show_js': self.show_js, 'histfile':False, 'input':True, 'output':True, 'ps1':self.ps1, 'ps2':self.ps2, 'terminal':self.output.isatty, 'enum_global': 'Object.keys(this)', 'lib_path': self.libdir or os.path.dirname(P(COMPILER_PATH)) # TODO: Change this to load pyj files from the src code } def get_from_repl(self): while True: try: return self.from_repl.get(True, 1) except Empty: if not self.is_alive(): raise SystemExit(1) def run(self): self.init_ctx() rl = None def set_prompt(p): self.prompt = p def prompt(lw): self.from_repl.put(to_python(lw)) self.ctx.g.set_prompt = set_prompt self.ctx.g.prompt = prompt self.ctx.eval(''' listeners = {}; rl = { setPrompt:set_prompt, write:Duktape.write, clearLine: function() {}, on: function(ev, cb) { listeners[ev] = cb; return rl; }, prompt: prompt, sync_prompt: true, send_line: function(line) { listeners['line'](line); }, send_interrupt: function() { listeners['SIGINT'](); }, close: function() {listeners['close'](); }, }; repl_options.readline = { createInterface: function(options) { rl.completer = options.completer; return rl; }}; exports.init_repl(repl_options) ''', fname='<init repl>') rl = self.ctx.g.rl completer = to_python(rl.completer) send_interrupt = to_python(rl.send_interrupt) send_line = to_python(rl.send_line) while True: ev, line = self.to_repl.get() try: if ev == 'SIGINT': self.output.write('\n') send_interrupt() elif ev == 'line': send_line(line) else: val = completer(line) val = to_python(val) self.from_repl.put(val[0]) except Exception as e: if isinstance(e, JSError): print (e.stack or e.message, file=sys.stderr) else: import traceback traceback.print_exc() for i in xrange(100): # Do this many times to ensure we dont deadlock self.from_repl.put(None) def __call__(self): if hasattr(self, 'readline'): history = os.path.join(cache_dir(), 'pyj-repl-history.txt') self.readline.parse_and_bind("tab: complete") try: self.readline.read_history_file(history) except EnvironmentError as e: if e.errno != errno.ENOENT: raise atexit.register(partial(self.readline.write_history_file, history)) def completer(text, num): if self.completions is None: self.to_repl.put(('complete', text)) self.completions = filter(None, self.get_from_repl()) if self.completions is None: return None try: return self.completions[num] except (IndexError, TypeError, AttributeError, KeyError): self.completions = None if hasattr(self, 'readline'): self.readline.set_completer(completer) while True: lw = self.get_from_repl() if lw is None: raise SystemExit(1) q = self.prompt if hasattr(self, 'readline'): self.readline.set_pre_input_hook(lambda:(self.readline.insert_text(lw), self.readline.redisplay())) else: q += lw try: line = raw_input(q) self.to_repl.put(('line', line)) except EOFError: return except KeyboardInterrupt: self.to_repl.put(('SIGINT', None))
class Repl(Thread): LINE_CONTINUATION_CHARS = r'\:' daemon = True def __init__(self, ps1='>>> ', ps2='... ', show_js=False, libdir=None): Thread.__init__(self, name='RapydScriptREPL') self.to_python = to_python self.JSError = JSError self.enc = getattr(sys.stdin, 'encoding', None) or 'utf-8' try: import readline self.readline = readline except ImportError: pass self.output = ANSIStream(sys.stdout) self.to_repl = Queue() self.from_repl = Queue() self.ps1, self.ps2 = ps1, ps2 self.show_js, self.libdir = show_js, libdir self.prompt = '' self.completions = None self.start() def init_ctx(self): self.prompt = self.ps1 self.ctx = compiler() self.ctx.g.Duktape.write = self.output.write self.ctx.eval( r'''console = { log: function() { Duktape.write(Array.prototype.slice.call(arguments).join(' ') + '\n');}}; console['error'] = console['log'];''') self.ctx.g.repl_options = { 'show_js': self.show_js, 'histfile': False, 'input': True, 'output': True, 'ps1': self.ps1, 'ps2': self.ps2, 'terminal': self.output.isatty, 'enum_global': 'Object.keys(this)', 'lib_path': self.libdir or os.path.dirname( P(COMPILER_PATH )) # TODO: Change this to load pyj files from the src code } def get_from_repl(self): while True: try: return self.from_repl.get(True, 1) except Empty: if not self.is_alive(): raise SystemExit(1) def run(self): self.init_ctx() rl = None def set_prompt(p): self.prompt = p def prompt(lw): self.from_repl.put(to_python(lw)) self.ctx.g.set_prompt = set_prompt self.ctx.g.prompt = prompt self.ctx.eval(''' listeners = {}; rl = { setPrompt:set_prompt, write:Duktape.write, clearLine: function() {}, on: function(ev, cb) { listeners[ev] = cb; return rl; }, prompt: prompt, sync_prompt: true, send_line: function(line) { listeners['line'](line); }, send_interrupt: function() { listeners['SIGINT'](); }, close: function() {listeners['close'](); }, }; repl_options.readline = { createInterface: function(options) { rl.completer = options.completer; return rl; }}; exports.init_repl(repl_options) ''', fname='<init repl>') rl = self.ctx.g.rl completer = to_python(rl.completer) send_interrupt = to_python(rl.send_interrupt) send_line = to_python(rl.send_line) while True: ev, line = self.to_repl.get() try: if ev == 'SIGINT': self.output.write('\n') send_interrupt() elif ev == 'line': send_line(line) else: val = completer(line) val = to_python(val) self.from_repl.put(val[0]) except Exception as e: if isinstance(e, JSError): print(e.stack or error_message(e), file=sys.stderr) else: import traceback traceback.print_exc() for i in range(100): # Do this many times to ensure we dont deadlock self.from_repl.put(None) def __call__(self): if hasattr(self, 'readline'): history = os.path.join(cache_dir(), 'pyj-repl-history.txt') self.readline.parse_and_bind("tab: complete") try: self.readline.read_history_file(history) except EnvironmentError as e: if e.errno != errno.ENOENT: raise atexit.register(partial(self.readline.write_history_file, history)) def completer(text, num): if self.completions is None: self.to_repl.put(('complete', text)) self.completions = list(filter(None, self.get_from_repl())) if not self.completions: return None try: return self.completions[num] except (IndexError, TypeError, AttributeError, KeyError): self.completions = None if hasattr(self, 'readline'): self.readline.set_completer(completer) while True: lw = self.get_from_repl() if lw is None: raise SystemExit(1) q = self.prompt if hasattr(self, 'readline'): self.readline.set_pre_input_hook(lambda: ( self.readline.insert_text(lw), self.readline.redisplay())) else: q += lw try: line = raw_input(q) self.to_repl.put(('line', line)) except EOFError: return except KeyboardInterrupt: self.to_repl.put(('SIGINT', None))
def print_version(self, file=None): from calibre.utils.terminal import ANSIStream s = ANSIStream(file) optparse.OptionParser.print_version(self, file=s)
def print_help(self, file=None): from calibre.utils.terminal import ANSIStream s = ANSIStream(file) _OptionParser.print_help(self, file=s)