diff options
| -rw-r--r-- | libmproxy/console/__init__.py | 69 | ||||
| -rw-r--r-- | libmproxy/console/pathedit.py | 69 | ||||
| -rw-r--r-- | test/test_console.py | 43 | ||||
| -rw-r--r-- | test/test_console_pathedit.py | 48 | 
4 files changed, 119 insertions, 110 deletions
diff --git a/libmproxy/console/__init__.py b/libmproxy/console/__init__.py index 9796677f..013c8003 100644 --- a/libmproxy/console/__init__.py +++ b/libmproxy/console/__init__.py @@ -18,76 +18,11 @@ import weakref  from .. import controller, utils, flow, script  from . import flowlist, flowview, help, common -from . import grideditor, palettes, contentview, flowdetailview +from . import grideditor, palettes, contentview, flowdetailview, pathedit  EVENTLOG_SIZE = 500 -class _PathCompleter: -    def __init__(self, _testing=False): -        """ -            _testing: disables reloading of the lookup table to make testing -            possible. -        """ -        self.lookup, self.offset = None, None -        self.final = None -        self._testing = _testing - -    def reset(self): -        self.lookup = None -        self.offset = -1 - -    def complete(self, txt): -        """ -            Returns the next completion for txt, or None if there is no -            completion. -        """ -        path = os.path.expanduser(txt) -        if not self.lookup: -            if not self._testing: -                # Lookup is a set of (display value, actual value) tuples. -                self.lookup = [] -                if os.path.isdir(path): -                    files = glob.glob(os.path.join(path, "*")) -                    prefix = txt -                else: -                    files = glob.glob(path+"*") -                    prefix = os.path.dirname(txt) -                prefix = prefix or "./" -                for f in files: -                    display = os.path.join(prefix, os.path.basename(f)) -                    if os.path.isdir(f): -                        display += "/" -                    self.lookup.append((display, f)) -            if not self.lookup: -                self.final = path -                return path -            self.lookup.sort() -            self.offset = -1 -            self.lookup.append((txt, txt)) -        self.offset += 1 -        if self.offset >= len(self.lookup): -            self.offset = 0 -        ret = self.lookup[self.offset] -        self.final = ret[1] -        return ret[0] - - -class PathEdit(urwid.Edit, _PathCompleter): -    def __init__(self, *args, **kwargs): -        urwid.Edit.__init__(self, *args, **kwargs) -        _PathCompleter.__init__(self) - -    def keypress(self, size, key): -        if key == "tab": -            comp = self.complete(self.get_edit_text()) -            self.set_edit_text(comp) -            self.set_edit_pos(len(comp)) -        else: -            self.reset() -        return urwid.Edit.keypress(self, size, key) - -  class ActionBar(urwid.WidgetWrap):      def __init__(self):          self.message("") @@ -97,7 +32,7 @@ class ActionBar(urwid.WidgetWrap):      def path_prompt(self, prompt, text):          self.expire = None -        self._w = PathEdit(prompt, text) +        self._w = pathedit.PathEdit(prompt, text)      def prompt(self, prompt, text = ""):          self.expire = None diff --git a/libmproxy/console/pathedit.py b/libmproxy/console/pathedit.py new file mode 100644 index 00000000..53cda3be --- /dev/null +++ b/libmproxy/console/pathedit.py @@ -0,0 +1,69 @@ +import glob +import os.path + +import urwid + + +class _PathCompleter: +    def __init__(self, _testing=False): +        """ +            _testing: disables reloading of the lookup table to make testing +            possible. +        """ +        self.lookup, self.offset = None, None +        self.final = None +        self._testing = _testing + +    def reset(self): +        self.lookup = None +        self.offset = -1 + +    def complete(self, txt): +        """ +            Returns the next completion for txt, or None if there is no +            completion. +        """ +        path = os.path.expanduser(txt) +        if not self.lookup: +            if not self._testing: +                # Lookup is a set of (display value, actual value) tuples. +                self.lookup = [] +                if os.path.isdir(path): +                    files = glob.glob(os.path.join(path, "*")) +                    prefix = txt +                else: +                    files = glob.glob(path+"*") +                    prefix = os.path.dirname(txt) +                prefix = prefix or "./" +                for f in files: +                    display = os.path.join(prefix, os.path.basename(f)) +                    if os.path.isdir(f): +                        display += "/" +                    self.lookup.append((display, f)) +            if not self.lookup: +                self.final = path +                return path +            self.lookup.sort() +            self.offset = -1 +            self.lookup.append((txt, txt)) +        self.offset += 1 +        if self.offset >= len(self.lookup): +            self.offset = 0 +        ret = self.lookup[self.offset] +        self.final = ret[1] +        return ret[0] + + +class PathEdit(urwid.Edit, _PathCompleter): +    def __init__(self, *args, **kwargs): +        urwid.Edit.__init__(self, *args, **kwargs) +        _PathCompleter.__init__(self) + +    def keypress(self, size, key): +        if key == "tab": +            comp = self.complete(self.get_edit_text()) +            self.set_edit_text(comp) +            self.set_edit_pos(len(comp)) +        else: +            self.reset() +        return urwid.Edit.keypress(self, size, key) diff --git a/test/test_console.py b/test/test_console.py index d66bd8b0..419b94a7 100644 --- a/test/test_console.py +++ b/test/test_console.py @@ -104,48 +104,5 @@ def test_format_keyvals():      ) -class TestPathCompleter: -    def test_lookup_construction(self): -        c = console._PathCompleter() - -        cd = tutils.test_data.path("completion") -        ca = os.path.join(cd, "a") -        assert c.complete(ca).endswith(normpath("/completion/aaa")) -        assert c.complete(ca).endswith(normpath("/completion/aab")) -        c.reset() -        ca = os.path.join(cd, "aaa") -        assert c.complete(ca).endswith(normpath("/completion/aaa")) -        assert c.complete(ca).endswith(normpath("/completion/aaa")) -        c.reset() -        assert c.complete(cd).endswith(normpath("/completion/aaa")) - -    def test_completion(self): -        c = console._PathCompleter(True) -        c.reset() -        c.lookup = [ -            ("a", "x/a"), -            ("aa", "x/aa"), -        ] -        assert c.complete("a") == "a" -        assert c.final == "x/a" -        assert c.complete("a") == "aa" -        assert c.complete("a") == "a" - -        c = console._PathCompleter(True) -        r = c.complete("l") -        assert c.final.endswith(r) - -        c.reset() -        assert c.complete("/nonexistent") == "/nonexistent" -        assert c.final == "/nonexistent" -        c.reset() -        assert c.complete("~") != "~" - -        c.reset() -        s = "thisisatotallynonexistantpathforsure" -        assert c.complete(s) == s -        assert c.final == s - -  def test_options():      assert console.Options(kill=True) diff --git a/test/test_console_pathedit.py b/test/test_console_pathedit.py new file mode 100644 index 00000000..605e1e2f --- /dev/null +++ b/test/test_console_pathedit.py @@ -0,0 +1,48 @@ +import os +from os.path import normpath +from libmproxy.console import pathedit + +import tutils + + +class TestPathCompleter: +    def test_lookup_construction(self): +        c = pathedit._PathCompleter() + +        cd = tutils.test_data.path("completion") +        ca = os.path.join(cd, "a") +        assert c.complete(ca).endswith(normpath("/completion/aaa")) +        assert c.complete(ca).endswith(normpath("/completion/aab")) +        c.reset() +        ca = os.path.join(cd, "aaa") +        assert c.complete(ca).endswith(normpath("/completion/aaa")) +        assert c.complete(ca).endswith(normpath("/completion/aaa")) +        c.reset() +        assert c.complete(cd).endswith(normpath("/completion/aaa")) + +    def test_completion(self): +        c = pathedit._PathCompleter(True) +        c.reset() +        c.lookup = [ +            ("a", "x/a"), +            ("aa", "x/aa"), +        ] +        assert c.complete("a") == "a" +        assert c.final == "x/a" +        assert c.complete("a") == "aa" +        assert c.complete("a") == "a" + +        c = pathedit._PathCompleter(True) +        r = c.complete("l") +        assert c.final.endswith(r) + +        c.reset() +        assert c.complete("/nonexistent") == "/nonexistent" +        assert c.final == "/nonexistent" +        c.reset() +        assert c.complete("~") != "~" + +        c.reset() +        s = "thisisatotallynonexistantpathforsure" +        assert c.complete(s) == s +        assert c.final == s  | 
