[pyrepl-checkins] r5440 - in pyrepl/branch/pyrepl-rework-n: pyrepl pyrepl/dfa test/unit

mwh at codespeak.net mwh at codespeak.net
Mon Jul 5 17:17:18 MEST 2004


Author: mwh
Date: Mon Jul  5 17:17:17 2004
New Revision: 5440

Modified:
   pyrepl/branch/pyrepl-rework-n/pyrepl/commands.py
   pyrepl/branch/pyrepl-rework-n/pyrepl/console.py
   pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/commandsm.py
   pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/keystrokesm.py
   pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/unicodesm.py
   pyrepl/branch/pyrepl-rework-n/pyrepl/reader.py
   pyrepl/branch/pyrepl-rework-n/pyrepl/unix_console.py
   pyrepl/branch/pyrepl-rework-n/test/unit/test_commandsm.py
   pyrepl/branch/pyrepl-rework-n/test/unit/test_keystrokesm.py
   pyrepl/branch/pyrepl-rework-n/test/unit/test_statemachines.py
Log:
some random code motion
changes to reader.py to begin using new machinery
everything still feels a bit too much like random hacking


Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/commands.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/commands.py	(original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/commands.py	Mon Jul  5 17:17:17 2004
@@ -284,7 +284,7 @@
 class self_insert(EditCommand):
     def do(self):
         r = self.reader
-        r.insert(self.event * r.get_arg())
+        r.insert(self.event[-1].raw * r.get_arg())
 
 class insert_nl(EditCommand):
     def do(self):

Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/console.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/console.py	(original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/console.py	Mon Jul  5 17:17:17 2004
@@ -17,6 +17,35 @@
 # CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
+
+class Keystroke(object):
+    def __init__(self, name, raw):
+        self.name = name
+        self.raw = raw
+    def __eq__(self, other):
+        if isinstance(other, Keystroke):
+            return self.name == other.name and self.raw == other.raw
+        else:
+            return False
+    def __repr__(self):
+        return "%s(%r, %r)"%(self.__class__.__name__,
+                             self.name, self.raw)
+
+
+class Command(object):
+    def __init__(self, cmd, keystrokes):
+        self.cmd = cmd
+        self.keystrokes = keystrokes
+    def __eq__(self, other):
+        if isinstance(other, Command):
+            return self.cmd == other.cmd \
+                   and self.keystrokes == other.keystrokes
+        else:
+            return False
+    def __repr__(self):
+        return "%s(%r, %r)"%(self.__class__.__name__,
+                             self.cmd, self.keystrokes)
+
 class Event:
     """An Event.  `evt' is 'key' or somesuch."""
 

Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/commandsm.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/commandsm.py	(original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/commandsm.py	Mon Jul  5 17:17:17 2004
@@ -1,25 +1,10 @@
+from pyrepl.console import Command
 from pyrepl.dfa.base import StateMachine
 from pyrepl.dfa.compile import make_match
 from pyrepl.keymap import parse_keys
 
 import unicodedata
 
-class Command(object):
-    def __init__(self, cmd, keystrokes):
-        self.cmd = cmd
-        self.keystrokes = keystrokes
-    def __eq__(self, other):
-        if isinstance(other, Command):
-            return self.cmd == other.cmd \
-                   and self.keystrokes == other.keystrokes
-        else:
-            return False
-    def __repr__(self):
-        return "%s(%r, %r)"%(self.__class__.__name__,
-                             self.cmd, self.keystrokes)
-        
-
-
 class CommandSM(StateMachine):
     def __init__(self, parent, keys, keymap, invalid_cls, character_cls):
         super(CommandSM, self).__init__(parent)

Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/keystrokesm.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/keystrokesm.py	(original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/keystrokesm.py	Mon Jul  5 17:17:17 2004
@@ -1,57 +1,14 @@
+from pyrepl.console import Keystroke
 from pyrepl.dfa.base import StateMachine
 from pyrepl.dfa.compile import make_match
 
-class Keystroke(object):
-    def __init__(self, name, raw):
-        self.name = name
-        self.raw = raw
-    def __eq__(self, other):
-        if isinstance(other, Keystroke):
-            return self.name == other.name and self.raw == other.raw
-        else:
-            return False
-    def __repr__(self):
-        return "%s(%r, %r)"%(self.__class__.__name__,
-                             self.name, self.raw)
-
-class CursesKeys(object):
-    _keynames = {
-        "delete" : "kdch1",
-        "down" : "kcud1",
-        "end" : "kend",
-        "enter" : "kent",
-        "f1"  : "kf1",   "f2"  : "kf2",   "f3"  : "kf3",   "f4"  : "kf4",
-        "f5"  : "kf5",   "f6"  : "kf6",   "f7"  : "kf7",   "f8"  : "kf8",
-        "f9"  : "kf9",   "f10" : "kf10",  "f11" : "kf11",  "f12" : "kf12",
-        "f13" : "kf13",  "f14" : "kf14",  "f15" : "kf15",  "f16" : "kf16",
-        "f17" : "kf17",  "f18" : "kf18",  "f19" : "kf19",  "f20" : "kf20",
-        "home" : "khome",
-        "insert" : "kich1",
-        "left" : "kcub1",
-        "page down" : "knp",
-        "page up"   : "kpp",
-        "right" : "kcuf1",
-        "up" : "kcuu1",
-        }    
-    def translate(self, key):
-        from curses import tigetstr
-        return tigetstr(self._keynames[key])
-    def all_keys(self):
-        r = []
-        for k in _keynames:
-            v = self.translate(k)
-            if v is not None:
-                r.append((v, k))
-        r.append((tcgetattr(fd)[6][VERASE], 'backspace'))
-        return r
-    def keynames(self):
-        return self._keynames.keys()
-
 class KeystrokeSM(StateMachine):
     def __init__(self, parent, keys):
         super(KeystrokeSM, self).__init__(parent)
         self.k = self.ck = make_match(keys.all_keys())
         self.chars = ''
+    def insert(self, keystroke):
+        self.output.insert(0, keystroke)
     def push(self, evt):
         if evt in self.k:
             self.chars += evt

Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/unicodesm.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/unicodesm.py	(original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/dfa/unicodesm.py	Mon Jul  5 17:17:17 2004
@@ -1,5 +1,7 @@
 from pyrepl.dfa.base import StateMachine
 
+import codecs
+
 class FixedWidthUnicodeSM(StateMachine):
     def __init__(self, parent, encoding):
         super(FixedWidthUnicodeSM, self).__init__(parent)
@@ -51,3 +53,11 @@
             c = self.chars
             self.chars = ''
             self.output.append(c.decode('utf-8'))
+
+def unicodesm_for_encoding(encoding):
+    if codecs.lookup(encoding) == codecs.lookup('utf-8'):
+        return UTF8UnicodeSM(None)
+    else:
+        # optimistic!
+        return FixedWidthUnicodeSM(None, encoding)
+        

Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/reader.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/reader.py	(original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/reader.py	Mon Jul  5 17:17:17 2004
@@ -20,7 +20,7 @@
 import types, unicodedata
 from pyrepl import commands
 from curses import ascii
-from pyrepl import input
+from pyrepl.dfa import commandsm
 
 def _make_unctrl_map():
     uc_map = {}
@@ -242,8 +242,8 @@
         self.syntax_table = make_default_syntax_table()
         self.input_trans_stack = []
         self.keymap = self.collect_keymap()
-        self.input_trans = input.KeymapTranslator(
-            self.keymap,
+        self.input_trans = commandsm.CommandSM(
+            None, self.console.keys, self.keymap,
             invalid_cls='invalid-key',
             character_cls='self-insert')
 
@@ -469,11 +469,11 @@
 
     def do_cmd(self, cmd):
         #print cmd
-        if isinstance(cmd[0], str):
-            cmd = self.commands.get(cmd[0],
-                                    commands.invalid_command)(self, cmd)
+        if isinstance(cmd.cmd, str):
+            cmd = self.commands.get(cmd.cmd,
+                                    commands.invalid_command)(self, (cmd.cmd, cmd.keystrokes))
         elif isinstance(cmd[0], type):
-            cmd = cmd[0](self, cmd)
+            cmd = cmd.cmd(self, cmd)
 
         cmd.do()
 
@@ -502,15 +502,15 @@
             self.dirty = 1
 
         while 1:
-            event = self.console.get_event(block)
-            if not event: # can only happen if we're not blocking
+            keystroke = self.console.get_event(block)
+            if keystroke is None: # can only happen if we're not blocking
                 return None
 
-            if event.evt == 'key':
-                self.input_trans.push(event)
-            elif event.evt == 'scroll':
+            if keystroke.name[0] != '<':
+                self.input_trans.push(keystroke)
+            elif keystroke.name == '<scroll>':
                 self.refresh()
-            elif event.evt == 'resize':
+            elif keystroke.name == '<resize>':
                 self.refresh()
             else:
                 pass

Modified: pyrepl/branch/pyrepl-rework-n/pyrepl/unix_console.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/pyrepl/unix_console.py	(original)
+++ pyrepl/branch/pyrepl-rework-n/pyrepl/unix_console.py	Mon Jul  5 17:17:17 2004
@@ -23,6 +23,7 @@
 from pyrepl.fancy_termios import tcgetattr, tcsetattr
 from pyrepl.console import Console, Event
 from pyrepl import unix_eventqueue
+from pyrepl.dfa import unicodesm, keystrokesm
 
 # there are arguments for changing this to "refresh"
 SIGWINCH_EVENT = 'repaint'
@@ -68,7 +69,56 @@
 
 POLLIN = getattr(select, "POLLIN", None)
 
+
+class CursesKeys(object):
+    _curses_keynames = {
+        "delete" : "kdch1",
+        "down" : "kcud1",
+        "end" : "kend",
+        "enter" : "kent",
+        "f1"  : "kf1",   "f2"  : "kf2",   "f3"  : "kf3",   "f4"  : "kf4",
+        "f5"  : "kf5",   "f6"  : "kf6",   "f7"  : "kf7",   "f8"  : "kf8",
+        "f9"  : "kf9",   "f10" : "kf10",  "f11" : "kf11",  "f12" : "kf12",
+        "f13" : "kf13",  "f14" : "kf14",  "f15" : "kf15",  "f16" : "kf16",
+        "f17" : "kf17",  "f18" : "kf18",  "f19" : "kf19",  "f20" : "kf20",
+        "home" : "khome",
+        "insert" : "kich1",
+        "left" : "kcub1",
+        "page down" : "knp",
+        "page up"   : "kpp",
+        "right" : "kcuf1",
+        "up" : "kcuu1",
+        }
+    _simple_keys = {
+        'enter':     '\r',
+#        'escape':    '\033',
+        'return':    '\r',
+        'space':     ' ',
+        'tab':       '\t',
+        }
+        
+    def translate(self, key):
+        if key in self._curses_keynames:
+            from curses import tigetstr
+            return tigetstr(self._curses_keynames[key])
+        elif key in self._simple_keys:
+            return self._simple_keys[key]
+    def all_keys(self):
+        r = []
+        for k in self.keynames():
+            v = self.translate(k)
+            if v is not None:
+                r.append((v, k))
+        # XXX ick
+        r.append((tcgetattr(0).cc[termios.VERASE], 'backspace'))
+        print r
+        return r
+    def keynames(self):
+        return self._curses_keynames.keys() + self._simple_keys.keys() + ['backspace']
+
+
 class UnixConsole(Console):
+    keys = CursesKeys()
     def __init__(self, f_in=0, f_out=1, term=None, encoding=None):
         if encoding is None:
             encoding = sys.getdefaultencoding()
@@ -89,6 +139,10 @@
         self.pollob.register(self.input_fd, POLLIN)
         curses.setupterm(term, self.output_fd)
         self.term = term
+
+        self.unicodesm = unicodesm.unicodesm_for_encoding(encoding)
+        self.keystrokesm = keystrokesm.KeystrokeSM(None, self.keys)
+        self.unicodesm.parent = self.keystrokesm
         
         self._bel   = _my_getstr("bel")
         self._civis = _my_getstr("civis", optional=1)
@@ -148,7 +202,6 @@
 
         self.__move = self.__move_short
 
-        self.event_queue = unix_eventqueue.EventQueue(self.input_fd)
         self.partial_char = ''
 
     def change_encoding(self, encoding):
@@ -328,7 +381,7 @@
 
     def move_cursor(self, x, y):
         if y < self.__offset or y >= self.__offset + self.height:
-            self.event_queue.insert(Event('scroll', None))
+            self.keystrokesm.insert(Keystroke('<scroll>', None))
         else:
             self.__move(x, y)
             self.__posxy = x, y
@@ -344,7 +397,7 @@
         raw.cflag &=~ (termios.CSIZE|termios.PARENB)
         raw.cflag |=  (termios.CS8)
         raw.lflag &=~ (termios.ICANON|termios.ECHO|
-                       termios.IEXTEN|(termios.ISIG*1))
+                       termios.IEXTEN|(termios.ISIG*0))
         raw.cc[termios.VMIN] = 1
         raw.cc[termios.VTIME] = 0
         tcsetattr(self.input_fd, termios.TCSADRAIN, raw)
@@ -373,40 +426,34 @@
 
     def __sigwinch(self, signum, frame):
         self.height, self.width = self.getheightwidth()
-        self.event_queue.insert(Event('resize', None))
+        self.keystroke.insert(Keystroke('<resize>', None))
 
     def push_char(self, char):
-        self.partial_char += char
-        try:
-            c = unicode(self.partial_char, self.encoding)
-        except UnicodeError, e:
-            if len(e.args) > 4 and \
-                   e.args[4] == 'unexpected end of data':
-                pass
-            else:
-                raise
-        else:
-            self.partial_char = ''
-            self.event_queue.push(c)
+        self.unicodesm.push_and_go(char)
         
     def get_event(self, block=1):
-        while self.event_queue.empty():
-            while 1: # All hail Unix!
+        while 1:
+            k = self.keystrokesm.get()
+            if k is not None:
+                return k
+            while 1:
                 try:
-                    self.push_char(os.read(self.input_fd, 1))
+                    c = os.read(self.input_fd, 1)
+                    if c:
+                        self.push_char(c)
                 except IOError, err:
                     if err.errno == errno.EINTR:
-                        if not self.event_queue.empty():
-                            return self.event_queue.get()
-                        else:
-                            continue
+                        k = self.keystrokesm.get()
+                        if k is not None:
+                            return k
+                        continue
                     else:
                         raise
                 else:
                     break
             if not block:
                 break
-        return self.event_queue.get()
+        return self.keystrokesm.get()
 
     def wait(self):
         self.pollob.poll()

Modified: pyrepl/branch/pyrepl-rework-n/test/unit/test_commandsm.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/test/unit/test_commandsm.py	(original)
+++ pyrepl/branch/pyrepl-rework-n/test/unit/test_commandsm.py	Mon Jul  5 17:17:17 2004
@@ -1,4 +1,4 @@
-from pyrepl.dfa.keystrokesm import Keystroke
+from pyrepl.console import Keystroke
 from pyrepl.dfa.commandsm import Command, CommandSM
 
 def do_feed(m, data, results):

Modified: pyrepl/branch/pyrepl-rework-n/test/unit/test_keystrokesm.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/test/unit/test_keystrokesm.py	(original)
+++ pyrepl/branch/pyrepl-rework-n/test/unit/test_keystrokesm.py	Mon Jul  5 17:17:17 2004
@@ -1,4 +1,5 @@
-from pyrepl.dfa.keystrokesm import KeystrokeSM, Keystroke
+from pyrepl.console import Keystroke
+from pyrepl.dfa.keystrokesm import KeystrokeSM
 
 class TestKeys(object):
     def translate(self, key):

Modified: pyrepl/branch/pyrepl-rework-n/test/unit/test_statemachines.py
==============================================================================
--- pyrepl/branch/pyrepl-rework-n/test/unit/test_statemachines.py	(original)
+++ pyrepl/branch/pyrepl-rework-n/test/unit/test_statemachines.py	Mon Jul  5 17:17:17 2004
@@ -1,6 +1,7 @@
 from pyrepl.dfa.unicodesm import UTF8UnicodeSM
-from pyrepl.dfa.keystrokesm import KeystrokeSM, Keystroke
-from pyrepl.dfa.commandsm import CommandSM, Command
+from pyrepl.dfa.keystrokesm import KeystrokeSM
+from pyrepl.dfa.commandsm import CommandSM
+from pyrepl.console import Command, Keystroke
 
 class TestKeys(object):
     def translate(self, key):


More information about the pyrepl-checkins mailing list