From arigo at codespeak.net Tue Oct 7 12:30:32 2008 From: arigo at codespeak.net (arigo at codespeak.net) Date: Tue, 7 Oct 2008 12:30:32 +0200 (CEST) Subject: [pyrepl-checkins] r58715 - pyrepl/trunk/pyrepl/pyrepl Message-ID: <20081007103032.A3B3B169EB5@codespeak.net> Author: arigo Date: Tue Oct 7 12:30:32 2008 New Revision: 58715 Modified: pyrepl/trunk/pyrepl/pyrepl/readline.py Log: Add more laziness. More specifically, avoid instantiating the ReadlineAlikeReader just to get or set the readline_completer and the completer_delims. Modified: pyrepl/trunk/pyrepl/pyrepl/readline.py ============================================================================== --- pyrepl/trunk/pyrepl/pyrepl/readline.py (original) +++ pyrepl/trunk/pyrepl/pyrepl/readline.py Tue Oct 7 12:30:32 2008 @@ -41,23 +41,26 @@ # ____________________________________________________________ -class ReadlineAlikeReader(HistoricalReader, CompletingReader): +class ReadlineConfig(object): readline_completer = None completer_delims = dict.fromkeys(' \t\n`~!@#$%^&*()-=+[{]}\\|;:\'",<>/?') +class ReadlineAlikeReader(HistoricalReader, CompletingReader): + def error(self, msg="none"): pass # don't show error messages by default def get_stem(self): b = self.buffer p = self.pos - 1 - while p >= 0 and b[p] not in self.completer_delims: + completer_delims = self.config.completer_delims + while p >= 0 and b[p] not in completer_delims: p -= 1 return ''.join(b[p+1:self.pos]) def get_completions(self, stem): result = [] - function = self.readline_completer + function = self.config.readline_completer if function is not None: try: stem = str(stem) # rlcompleter.py seems to not like unicode @@ -148,11 +151,13 @@ reader = None saved_history_length = -1 startup_hook = None + config = ReadlineConfig() def get_reader(self): if self.reader is None: console = UnixConsole(self.f_in, self.f_out, encoding=ENCODING) self.reader = ReadlineAlikeReader(console) + self.reader.config = self.config return self.reader def raw_input(self, prompt=''): @@ -181,16 +186,16 @@ pass # XXX we don't support parsing GNU-readline-style init files def set_completer(self, function=None): - self.get_reader().readline_completer = function + self.config.readline_completer = function def get_completer(self): - return self.get_reader().readline_completer + return self.config.readline_completer def set_completer_delims(self, string): - self.get_reader().completer_delims = dict.fromkeys(string) + self.config.completer_delims = dict.fromkeys(string) def get_completer_delims(self): - chars = self.get_reader().completer_delims.keys() + chars = self.config.completer_delims.keys() chars.sort() return ''.join(chars) From arigo at codespeak.net Tue Oct 7 15:19:19 2008 From: arigo at codespeak.net (arigo at codespeak.net) Date: Tue, 7 Oct 2008 15:19:19 +0200 (CEST) Subject: [pyrepl-checkins] r58745 - pyrepl/trunk/pyrepl/pyrepl Message-ID: <20081007131919.76400169F15@codespeak.net> Author: arigo Date: Tue Oct 7 15:19:17 2008 New Revision: 58745 Modified: pyrepl/trunk/pyrepl/pyrepl/unix_console.py Log: os.read() typically raises OSError, not IOError. Modified: pyrepl/trunk/pyrepl/pyrepl/unix_console.py ============================================================================== --- pyrepl/trunk/pyrepl/pyrepl/unix_console.py (original) +++ pyrepl/trunk/pyrepl/pyrepl/unix_console.py Tue Oct 7 15:19:17 2008 @@ -400,7 +400,7 @@ while 1: # All hail Unix! try: self.push_char(os.read(self.input_fd, 1)) - except IOError, err: + except (IOError, OSError), err: if err.errno == errno.EINTR: if not self.event_queue.empty(): return self.event_queue.get()