aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2015-03-20 10:54:57 +1300
committerAldo Cortesi <aldo@nullcube.com>2015-03-20 10:54:57 +1300
commit560e44c637e4f1fcbeba1305fc1eb39e3d796013 (patch)
treec7ca1308ce79ed9195ffffa7cfb9b5abdce50008
parenta3f4296bf1ba0ac1a72d5a44a504d375707fdc39 (diff)
downloadmitmproxy-560e44c637e4f1fcbeba1305fc1eb39e3d796013.tar.gz
mitmproxy-560e44c637e4f1fcbeba1305fc1eb39e3d796013.tar.bz2
mitmproxy-560e44c637e4f1fcbeba1305fc1eb39e3d796013.zip
Pull PathEdit out into its own file.
-rw-r--r--libmproxy/console/__init__.py69
-rw-r--r--libmproxy/console/pathedit.py69
-rw-r--r--test/test_console.py43
-rw-r--r--test/test_console_pathedit.py48
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