mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-23 00:01:36 +00:00
Pull PathEdit out into its own file.
This commit is contained in:
parent
a3f4296bf1
commit
560e44c637
@ -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
|
||||
|
69
libmproxy/console/pathedit.py
Normal file
69
libmproxy/console/pathedit.py
Normal file
@ -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)
|
@ -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)
|
||||
|
48
test/test_console_pathedit.py
Normal file
48
test/test_console_pathedit.py
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user