mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-10 15:32:38 -07:00
Bump cherrypy from 18.8.0 to 18.9.0 (#2266)
* Bump cherrypy from 18.8.0 to 18.9.0 Bumps [cherrypy](https://github.com/cherrypy/cherrypy) from 18.8.0 to 18.9.0. - [Changelog](https://github.com/cherrypy/cherrypy/blob/main/CHANGES.rst) - [Commits](https://github.com/cherrypy/cherrypy/compare/v18.8.0...v18.9.0) --- updated-dependencies: - dependency-name: cherrypy dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * Update cherrypy==18.9.0 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> [skip ci]
This commit is contained in:
parent
cfefa928be
commit
faef9a94c4
673 changed files with 159850 additions and 11583 deletions
849
lib/pythonwin/pywin/framework/mdi_pychecker.py
Normal file
849
lib/pythonwin/pywin/framework/mdi_pychecker.py
Normal file
|
@ -0,0 +1,849 @@
|
|||
######################################################################
|
||||
##
|
||||
## The Pychecker MDI Plug-In UserModule for Pythonwin
|
||||
##
|
||||
## contributed by Robert Kiendl
|
||||
##
|
||||
## Style is similar to (and inherited) from the SGrepMDI UserModule
|
||||
##
|
||||
## Usage:
|
||||
##
|
||||
## Start Pychecker on current file: Menu/File/New../Pychecker.
|
||||
## Use it: Jump to Pychecker warning source lines by double-click.
|
||||
## Auto-add "#$pycheck_no" / "#$pycheck_no=specific-re-pattern" tags
|
||||
## to source lines by context/right-mouse-click on warning lines.
|
||||
##
|
||||
## It requires pychecker installed and the pychecker.bat to be on
|
||||
## the PATH. Example pychecker.bat:
|
||||
##
|
||||
## REM pychecker.bat
|
||||
## C:\bin\python.exe C:\PYTHON23\Lib\site-packages\pychecker\checker.py %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
##
|
||||
## Adding it as default module in PythonWin:
|
||||
##
|
||||
## +++ ./intpyapp.py 2006-10-02 17:59:32.974161600 +0200
|
||||
## @@ -272,7 +282,7 @@
|
||||
## def LoadUserModules(self, moduleNames = None):
|
||||
## # Load the users modules.
|
||||
## if moduleNames is None:
|
||||
## - default = "sgrepmdi"
|
||||
## + default = "sgrepmdi,mdi_pychecker"
|
||||
## moduleNames=win32ui.GetProfileVal('Python','Startup Modules',default)
|
||||
## self.DoLoadModules(moduleNames)
|
||||
##
|
||||
######################################################################
|
||||
|
||||
import glob
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import time
|
||||
|
||||
import win32api
|
||||
import win32con
|
||||
import win32ui
|
||||
from pywin.mfc import dialog, docview, window
|
||||
|
||||
from . import scriptutils
|
||||
|
||||
|
||||
def getsubdirs(d):
|
||||
dlist = []
|
||||
flist = glob.glob(d + "\\*")
|
||||
for f in flist:
|
||||
if os.path.isdir(f):
|
||||
dlist.append(f)
|
||||
dlist = dlist + getsubdirs(f)
|
||||
return dlist
|
||||
|
||||
|
||||
class dirpath:
|
||||
def __init__(self, str, recurse=0):
|
||||
dp = str.split(";")
|
||||
dirs = {}
|
||||
for d in dp:
|
||||
if os.path.isdir(d):
|
||||
d = d.lower()
|
||||
if d not in dirs:
|
||||
dirs[d] = None
|
||||
if recurse:
|
||||
subdirs = getsubdirs(d)
|
||||
for sd in subdirs:
|
||||
sd = sd.lower()
|
||||
if sd not in dirs:
|
||||
dirs[sd] = None
|
||||
elif os.path.isfile(d):
|
||||
pass
|
||||
else:
|
||||
x = None
|
||||
if d in os.environ:
|
||||
x = dirpath(os.environ[d])
|
||||
elif d[:5] == "HKEY_":
|
||||
keystr = d.split("\\")
|
||||
try:
|
||||
root = eval("win32con." + keystr[0])
|
||||
except:
|
||||
win32ui.MessageBox(
|
||||
"Can't interpret registry key name '%s'" % keystr[0]
|
||||
)
|
||||
try:
|
||||
subkey = "\\".join(keystr[1:])
|
||||
val = win32api.RegQueryValue(root, subkey)
|
||||
if val:
|
||||
x = dirpath(val)
|
||||
else:
|
||||
win32ui.MessageBox(
|
||||
"Registry path '%s' did not return a path entry" % d
|
||||
)
|
||||
except:
|
||||
win32ui.MessageBox(
|
||||
"Can't interpret registry key value: %s" % keystr[1:]
|
||||
)
|
||||
else:
|
||||
win32ui.MessageBox("Directory '%s' not found" % d)
|
||||
if x:
|
||||
for xd in x:
|
||||
if xd not in dirs:
|
||||
dirs[xd] = None
|
||||
if recurse:
|
||||
subdirs = getsubdirs(xd)
|
||||
for sd in subdirs:
|
||||
sd = sd.lower()
|
||||
if sd not in dirs:
|
||||
dirs[sd] = None
|
||||
self.dirs = []
|
||||
for d in dirs.keys():
|
||||
self.dirs.append(d)
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self.dirs[key]
|
||||
|
||||
def __len__(self):
|
||||
return len(self.dirs)
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
self.dirs[key] = value
|
||||
|
||||
def __delitem__(self, key):
|
||||
del self.dirs[key]
|
||||
|
||||
def __getslice__(self, lo, hi):
|
||||
return self.dirs[lo:hi]
|
||||
|
||||
def __setslice__(self, lo, hi, seq):
|
||||
self.dirs[lo:hi] = seq
|
||||
|
||||
def __delslice__(self, lo, hi):
|
||||
del self.dirs[lo:hi]
|
||||
|
||||
def __add__(self, other):
|
||||
if type(other) == type(self) or type(other) == type([]):
|
||||
return self.dirs + other.dirs
|
||||
|
||||
def __radd__(self, other):
|
||||
if type(other) == type(self) or type(other) == type([]):
|
||||
return other.dirs + self.dirs
|
||||
|
||||
|
||||
# Group(1) is the filename, group(2) is the lineno.
|
||||
# regexGrepResult=regex.compile("^\\([a-zA-Z]:.*\\)(\\([0-9]+\\))")
|
||||
# regexGrep=re.compile(r"^([a-zA-Z]:[^(]*)\((\d+)\)")
|
||||
regexGrep = re.compile(r"^(..[^\(:]+)?[\(:](\d+)[\):]:?\s*(.*)")
|
||||
|
||||
# these are the atom numbers defined by Windows for basic dialog controls
|
||||
|
||||
BUTTON = 0x80
|
||||
EDIT = 0x81
|
||||
STATIC = 0x82
|
||||
LISTBOX = 0x83
|
||||
SCROLLBAR = 0x84
|
||||
COMBOBOX = 0x85
|
||||
|
||||
|
||||
class TheTemplate(docview.RichEditDocTemplate):
|
||||
def __init__(self):
|
||||
docview.RichEditDocTemplate.__init__(
|
||||
self, win32ui.IDR_TEXTTYPE, TheDocument, TheFrame, TheView
|
||||
)
|
||||
self.SetDocStrings(
|
||||
"\nPychecker\nPychecker\nPychecker params (*.pychecker)\n.pychecker\n\n\n"
|
||||
)
|
||||
win32ui.GetApp().AddDocTemplate(self)
|
||||
self.docparams = None
|
||||
|
||||
def MatchDocType(self, fileName, fileType):
|
||||
doc = self.FindOpenDocument(fileName)
|
||||
if doc:
|
||||
return doc
|
||||
ext = os.path.splitext(fileName)[1].lower()
|
||||
if ext == ".pychecker":
|
||||
return win32ui.CDocTemplate_Confidence_yesAttemptNative
|
||||
return win32ui.CDocTemplate_Confidence_noAttempt
|
||||
|
||||
def setParams(self, params):
|
||||
self.docparams = params
|
||||
|
||||
def readParams(self):
|
||||
tmp = self.docparams
|
||||
self.docparams = None
|
||||
return tmp
|
||||
|
||||
|
||||
class TheFrame(window.MDIChildWnd):
|
||||
# The template and doc params will one day be removed.
|
||||
def __init__(self, wnd=None):
|
||||
window.MDIChildWnd.__init__(self, wnd)
|
||||
|
||||
|
||||
class TheDocument(docview.RichEditDoc):
|
||||
def __init__(self, template):
|
||||
docview.RichEditDoc.__init__(self, template)
|
||||
self.dirpattern = ""
|
||||
self.filpattern = ""
|
||||
self.greppattern = ""
|
||||
self.casesensitive = 1
|
||||
self.recurse = 1
|
||||
self.verbose = 0
|
||||
|
||||
def OnOpenDocument(self, fnm):
|
||||
# this bizarre stuff with params is so right clicking in a result window
|
||||
# and starting a new grep can communicate the default parameters to the
|
||||
# new grep.
|
||||
try:
|
||||
params = open(fnm, "r").read()
|
||||
except:
|
||||
params = None
|
||||
self.setInitParams(params)
|
||||
return self.OnNewDocument()
|
||||
|
||||
def OnCloseDocument(self):
|
||||
try:
|
||||
win32ui.GetApp().DeleteIdleHandler(self.idleHandler)
|
||||
except:
|
||||
pass
|
||||
return self._obj_.OnCloseDocument()
|
||||
|
||||
def saveInitParams(self):
|
||||
# Only save the flags, not the text boxes.
|
||||
paramstr = "\t\t\t%d\t%d" % (self.casesensitive, self.recurse)
|
||||
win32ui.WriteProfileVal("Pychecker", "Params", paramstr)
|
||||
|
||||
def setInitParams(self, paramstr):
|
||||
if paramstr is None:
|
||||
paramstr = win32ui.GetProfileVal("Pychecker", "Params", "\t\t\t1\t0\t0")
|
||||
params = paramstr.split("\t")
|
||||
if len(params) < 3:
|
||||
params = params + [""] * (3 - len(params))
|
||||
if len(params) < 6:
|
||||
params = params + [0] * (6 - len(params))
|
||||
self.dirpattern = params[0]
|
||||
self.filpattern = params[1]
|
||||
self.greppattern = params[2] or "-#1000 --only"
|
||||
self.casesensitive = int(params[3])
|
||||
self.recurse = int(params[4])
|
||||
self.verbose = int(params[5])
|
||||
# setup some reasonable defaults.
|
||||
if not self.dirpattern:
|
||||
try:
|
||||
editor = win32ui.GetMainFrame().MDIGetActive()[0].GetEditorView()
|
||||
self.dirpattern = os.path.abspath(
|
||||
os.path.dirname(editor.GetDocument().GetPathName())
|
||||
)
|
||||
except (AttributeError, win32ui.error):
|
||||
self.dirpattern = os.getcwd()
|
||||
if not self.filpattern:
|
||||
try:
|
||||
editor = win32ui.GetMainFrame().MDIGetActive()[0].GetEditorView()
|
||||
self.filpattern = editor.GetDocument().GetPathName()
|
||||
except AttributeError:
|
||||
self.filpattern = "*.py"
|
||||
|
||||
def OnNewDocument(self):
|
||||
if self.dirpattern == "":
|
||||
self.setInitParams(greptemplate.readParams())
|
||||
d = TheDialog(
|
||||
self.dirpattern,
|
||||
self.filpattern,
|
||||
self.greppattern,
|
||||
self.casesensitive,
|
||||
self.recurse,
|
||||
self.verbose,
|
||||
)
|
||||
if d.DoModal() == win32con.IDOK:
|
||||
self.dirpattern = d["dirpattern"]
|
||||
self.filpattern = d["filpattern"]
|
||||
self.greppattern = d["greppattern"]
|
||||
# self.casesensitive = d['casesensitive']
|
||||
# self.recurse = d['recursive']
|
||||
# self.verbose = d['verbose']
|
||||
self.doSearch()
|
||||
self.saveInitParams()
|
||||
return 1
|
||||
return 0 # cancelled - return zero to stop frame creation.
|
||||
|
||||
def doSearch(self):
|
||||
self.dp = dirpath(self.dirpattern, self.recurse)
|
||||
self.SetTitle(
|
||||
"Pychecker Run '%s' (options: %s)" % (self.filpattern, self.greppattern)
|
||||
)
|
||||
# self.text = []
|
||||
self.GetFirstView().Append(
|
||||
"#Pychecker Run in " + self.dirpattern + " %s\n" % time.asctime()
|
||||
)
|
||||
if self.verbose:
|
||||
self.GetFirstView().Append("# =" + repr(self.dp.dirs) + "\n")
|
||||
self.GetFirstView().Append("# Files " + self.filpattern + "\n")
|
||||
self.GetFirstView().Append("# Options " + self.greppattern + "\n")
|
||||
self.fplist = self.filpattern.split(";")
|
||||
self.GetFirstView().Append(
|
||||
"# Running... ( double click on result lines in order to jump to the source code ) \n"
|
||||
)
|
||||
win32ui.SetStatusText("Pychecker running. Please wait...", 0)
|
||||
self.dpndx = self.fpndx = 0
|
||||
self.fndx = -1
|
||||
if not self.dp:
|
||||
self.GetFirstView().Append(
|
||||
"# ERROR: '%s' does not resolve to any search locations"
|
||||
% self.dirpattern
|
||||
)
|
||||
self.SetModifiedFlag(0)
|
||||
else:
|
||||
##self.flist = glob.glob(self.dp[0]+'\\'+self.fplist[0])
|
||||
import operator
|
||||
|
||||
self.flist = reduce(operator.add, list(map(glob.glob, self.fplist)))
|
||||
# import pywin.debugger;pywin.debugger.set_trace()
|
||||
self.startPycheckerRun()
|
||||
|
||||
def idleHandler(self, handler, count):
|
||||
import time
|
||||
|
||||
time.sleep(0.001)
|
||||
if self.result != None:
|
||||
win32ui.GetApp().DeleteIdleHandler(self.idleHandler)
|
||||
return 0
|
||||
return 1 # more
|
||||
|
||||
def startPycheckerRun(self):
|
||||
self.result = None
|
||||
old = win32api.SetCursor(win32api.LoadCursor(0, win32con.IDC_APPSTARTING))
|
||||
win32ui.GetApp().AddIdleHandler(self.idleHandler)
|
||||
import _thread
|
||||
|
||||
_thread.start_new(self.threadPycheckerRun, ())
|
||||
##win32api.SetCursor(old)
|
||||
|
||||
def threadPycheckerRun(self):
|
||||
result = ""
|
||||
rc = -1
|
||||
try:
|
||||
options = self.greppattern
|
||||
files = " ".join(self.flist)
|
||||
# Recently MarkH has failed to run pychecker without it having
|
||||
# been explicitly installed - so we assume it is and locate it
|
||||
# from its default location.
|
||||
# Step1 - get python.exe
|
||||
py = os.path.join(sys.prefix, "python.exe")
|
||||
if not os.path.isfile(py):
|
||||
if "64 bit" in sys.version:
|
||||
py = os.path.join(sys.prefix, "PCBuild", "amd64", "python.exe")
|
||||
else:
|
||||
py = os.path.join(sys.prefix, "PCBuild", "python.exe")
|
||||
try:
|
||||
py = win32api.GetShortPathName(py)
|
||||
except win32api.error:
|
||||
py = ""
|
||||
# Find checker.py
|
||||
import sysconfig
|
||||
|
||||
pychecker = os.path.join(
|
||||
sysconfig.get_paths()["purelib"], "pychecker", "checker.py"
|
||||
)
|
||||
if not os.path.isfile(py):
|
||||
result = "Can't find python.exe!\n"
|
||||
elif not os.path.isfile(pychecker):
|
||||
result = (
|
||||
"Can't find checker.py - please install pychecker "
|
||||
"(or run 'setup.py install' if you have the source version)\n"
|
||||
)
|
||||
else:
|
||||
cmd = '%s "%s" %s %s 2>&1' % (py, pychecker, options, files)
|
||||
##fin,fout,ferr=os.popen3(cmd)
|
||||
##result=ferr.read()+fout.read()
|
||||
result = os.popen(cmd).read()
|
||||
##rc=f.close()
|
||||
self.GetFirstView().Append(result)
|
||||
finally:
|
||||
self.result = result
|
||||
print("== Pychecker run finished ==")
|
||||
self.GetFirstView().Append("\n" + "== Pychecker run finished ==")
|
||||
self.SetModifiedFlag(0)
|
||||
|
||||
def _inactive_idleHandler(self, handler, count):
|
||||
self.fndx = self.fndx + 1
|
||||
if self.fndx < len(self.flist):
|
||||
f = self.flist[self.fndx]
|
||||
if self.verbose:
|
||||
self.GetFirstView().Append("# .." + f + "\n")
|
||||
win32ui.SetStatusText("Searching " + f, 0)
|
||||
lines = open(f, "r").readlines()
|
||||
for i in range(len(lines)):
|
||||
line = lines[i]
|
||||
if self.pat.search(line) != None:
|
||||
self.GetFirstView().Append(f + "(" + repr(i + 1) + ") " + line)
|
||||
else:
|
||||
self.fndx = -1
|
||||
self.fpndx = self.fpndx + 1
|
||||
if self.fpndx < len(self.fplist):
|
||||
self.flist = glob.glob(
|
||||
self.dp[self.dpndx] + "\\" + self.fplist[self.fpndx]
|
||||
)
|
||||
else:
|
||||
self.fpndx = 0
|
||||
self.dpndx = self.dpndx + 1
|
||||
if self.dpndx < len(self.dp):
|
||||
self.flist = glob.glob(
|
||||
self.dp[self.dpndx] + "\\" + self.fplist[self.fpndx]
|
||||
)
|
||||
else:
|
||||
win32ui.SetStatusText("Search complete.", 0)
|
||||
self.SetModifiedFlag(0) # default to not modified.
|
||||
try:
|
||||
win32ui.GetApp().DeleteIdleHandler(self.idleHandler)
|
||||
except:
|
||||
pass
|
||||
return 0
|
||||
return 1
|
||||
|
||||
def GetParams(self):
|
||||
return (
|
||||
self.dirpattern
|
||||
+ "\t"
|
||||
+ self.filpattern
|
||||
+ "\t"
|
||||
+ self.greppattern
|
||||
+ "\t"
|
||||
+ repr(self.casesensitive)
|
||||
+ "\t"
|
||||
+ repr(self.recurse)
|
||||
+ "\t"
|
||||
+ repr(self.verbose)
|
||||
)
|
||||
|
||||
def OnSaveDocument(self, filename):
|
||||
# print 'OnSaveDocument() filename=',filename
|
||||
savefile = open(filename, "wb")
|
||||
txt = self.GetParams() + "\n"
|
||||
# print 'writing',txt
|
||||
savefile.write(txt)
|
||||
savefile.close()
|
||||
self.SetModifiedFlag(0)
|
||||
return 1
|
||||
|
||||
|
||||
ID_OPEN_FILE = 0xE500
|
||||
ID_PYCHECKER = 0xE501
|
||||
ID_SAVERESULTS = 0x502
|
||||
ID_TRYAGAIN = 0x503
|
||||
ID_ADDCOMMENT = 0x504
|
||||
ID_ADDPYCHECKNO2 = 0x505
|
||||
|
||||
|
||||
class TheView(docview.RichEditView):
|
||||
def __init__(self, doc):
|
||||
docview.RichEditView.__init__(self, doc)
|
||||
self.SetWordWrap(win32ui.CRichEditView_WrapNone)
|
||||
self.HookHandlers()
|
||||
|
||||
def OnInitialUpdate(self):
|
||||
rc = self._obj_.OnInitialUpdate()
|
||||
format = (-402653169, 0, 200, 0, 0, 0, 49, "Courier New")
|
||||
self.SetDefaultCharFormat(format)
|
||||
return rc
|
||||
|
||||
def HookHandlers(self):
|
||||
self.HookMessage(self.OnRClick, win32con.WM_RBUTTONDOWN)
|
||||
self.HookCommand(self.OnCmdOpenFile, ID_OPEN_FILE)
|
||||
self.HookCommand(self.OnCmdThe, ID_PYCHECKER)
|
||||
self.HookCommand(self.OnCmdSave, ID_SAVERESULTS)
|
||||
self.HookCommand(self.OnTryAgain, ID_TRYAGAIN)
|
||||
self.HookCommand(self.OnAddComment, ID_ADDCOMMENT)
|
||||
self.HookCommand(self.OnAddComment, ID_ADDPYCHECKNO2)
|
||||
self.HookMessage(self.OnLDblClick, win32con.WM_LBUTTONDBLCLK)
|
||||
|
||||
def OnLDblClick(self, params):
|
||||
line = self.GetLine()
|
||||
regexGrepResult = regexGrep.match(line)
|
||||
if regexGrepResult:
|
||||
fname = regexGrepResult.group(1)
|
||||
line = int(regexGrepResult.group(2))
|
||||
scriptutils.JumpToDocument(fname, line)
|
||||
return 0 # dont pass on
|
||||
return 1 # pass it on by default.
|
||||
|
||||
def OnRClick(self, params):
|
||||
menu = win32ui.CreatePopupMenu()
|
||||
flags = win32con.MF_STRING | win32con.MF_ENABLED
|
||||
lineno = self._obj_.LineFromChar(-1) # selection or current line
|
||||
line = self._obj_.GetLine(lineno)
|
||||
regexGrepResult = regexGrep.match(line)
|
||||
charstart, charend = self._obj_.GetSel()
|
||||
if regexGrepResult:
|
||||
self.fnm = regexGrepResult.group(1)
|
||||
self.lnnum = int(regexGrepResult.group(2))
|
||||
menu.AppendMenu(flags, ID_OPEN_FILE, "&Open " + self.fnm)
|
||||
menu.AppendMenu(
|
||||
flags, ID_ADDCOMMENT, "&Add to source: Comment Tag/#$pycheck_no .."
|
||||
)
|
||||
menu.AppendMenu(
|
||||
flags,
|
||||
ID_ADDPYCHECKNO2,
|
||||
"&Add to source: Specific #$pycheck_no=%(errtext)s ..",
|
||||
)
|
||||
menu.AppendMenu(win32con.MF_SEPARATOR)
|
||||
menu.AppendMenu(flags, ID_TRYAGAIN, "&Try Again")
|
||||
menu.AppendMenu(flags, win32ui.ID_EDIT_CUT, "Cu&t")
|
||||
menu.AppendMenu(flags, win32ui.ID_EDIT_COPY, "&Copy")
|
||||
menu.AppendMenu(flags, win32ui.ID_EDIT_PASTE, "&Paste")
|
||||
menu.AppendMenu(flags, win32con.MF_SEPARATOR)
|
||||
menu.AppendMenu(flags, win32ui.ID_EDIT_SELECT_ALL, "&Select all")
|
||||
menu.AppendMenu(flags, win32con.MF_SEPARATOR)
|
||||
menu.AppendMenu(flags, ID_SAVERESULTS, "Sa&ve results")
|
||||
menu.TrackPopupMenu(params[5])
|
||||
return 0
|
||||
|
||||
def OnAddComment(self, cmd, code):
|
||||
addspecific = cmd == ID_ADDPYCHECKNO2
|
||||
_ = list(self.GetSel())
|
||||
_.sort()
|
||||
start, end = _
|
||||
line_start, line_end = self.LineFromChar(start), self.LineFromChar(end)
|
||||
first = 1
|
||||
for i in range(line_start, line_end + 1):
|
||||
line = self.GetLine(i)
|
||||
m = regexGrep.match(line)
|
||||
if m:
|
||||
if first:
|
||||
first = 0
|
||||
cmnt = dialog.GetSimpleInput(
|
||||
"Add to %s lines" % (line_end - line_start + 1),
|
||||
addspecific
|
||||
and " #$pycheck_no=%(errtext)s"
|
||||
or " #$pycheck_no",
|
||||
)
|
||||
if not cmnt:
|
||||
return 0
|
||||
##import pywin.debugger;pywin.debugger.set_trace()
|
||||
fname = m.group(1)
|
||||
line = int(m.group(2))
|
||||
view = scriptutils.JumpToDocument(fname, line)
|
||||
pos = view.LineIndex(line) - 1
|
||||
if view.GetTextRange(pos - 1, pos) in ("\r", "\n"):
|
||||
pos -= 1
|
||||
view.SetSel(pos, pos)
|
||||
errtext = m.group(3)
|
||||
if start != end and line_start == line_end:
|
||||
errtext = self.GetSelText()
|
||||
errtext = repr(re.escape(errtext).replace("\ ", " "))
|
||||
view.ReplaceSel(addspecific and cmnt % locals() or cmnt)
|
||||
return 0
|
||||
|
||||
def OnCmdOpenFile(self, cmd, code):
|
||||
doc = win32ui.GetApp().OpenDocumentFile(self.fnm)
|
||||
if doc:
|
||||
vw = doc.GetFirstView()
|
||||
# hope you have an editor that implements GotoLine()!
|
||||
try:
|
||||
vw.GotoLine(int(self.lnnum))
|
||||
except:
|
||||
pass
|
||||
return 0
|
||||
|
||||
def OnCmdThe(self, cmd, code):
|
||||
curparamsstr = self.GetDocument().GetParams()
|
||||
params = curparamsstr.split("\t")
|
||||
params[2] = self.sel
|
||||
greptemplate.setParams("\t".join(params))
|
||||
greptemplate.OpenDocumentFile()
|
||||
return 0
|
||||
|
||||
def OnTryAgain(self, cmd, code):
|
||||
greptemplate.setParams(self.GetDocument().GetParams())
|
||||
greptemplate.OpenDocumentFile()
|
||||
return 0
|
||||
|
||||
def OnCmdSave(self, cmd, code):
|
||||
flags = win32con.OFN_OVERWRITEPROMPT
|
||||
dlg = win32ui.CreateFileDialog(
|
||||
0, None, None, flags, "Text Files (*.txt)|*.txt||", self
|
||||
)
|
||||
dlg.SetOFNTitle("Save Results As")
|
||||
if dlg.DoModal() == win32con.IDOK:
|
||||
pn = dlg.GetPathName()
|
||||
self._obj_.SaveFile(pn)
|
||||
return 0
|
||||
|
||||
def Append(self, strng):
|
||||
numlines = self.GetLineCount()
|
||||
endpos = self.LineIndex(numlines - 1) + len(self.GetLine(numlines - 1))
|
||||
self.SetSel(endpos, endpos)
|
||||
self.ReplaceSel(strng)
|
||||
|
||||
|
||||
class TheDialog(dialog.Dialog):
|
||||
def __init__(self, dp, fp, gp, cs, r, v):
|
||||
style = (
|
||||
win32con.DS_MODALFRAME
|
||||
| win32con.WS_POPUP
|
||||
| win32con.WS_VISIBLE
|
||||
| win32con.WS_CAPTION
|
||||
| win32con.WS_SYSMENU
|
||||
| win32con.DS_SETFONT
|
||||
)
|
||||
CS = win32con.WS_CHILD | win32con.WS_VISIBLE
|
||||
tmp = [
|
||||
["Pychecker Run", (0, 0, 210, 90), style, None, (8, "MS Sans Serif")],
|
||||
]
|
||||
tmp.append([STATIC, "Files:", -1, (7, 7, 50, 9), CS])
|
||||
tmp.append(
|
||||
[
|
||||
EDIT,
|
||||
gp,
|
||||
103,
|
||||
(52, 7, 144, 11),
|
||||
CS | win32con.WS_TABSTOP | win32con.ES_AUTOHSCROLL | win32con.WS_BORDER,
|
||||
]
|
||||
)
|
||||
tmp.append([STATIC, "Directories:", -1, (7, 20, 50, 9), CS])
|
||||
tmp.append(
|
||||
[
|
||||
EDIT,
|
||||
dp,
|
||||
102,
|
||||
(52, 20, 128, 11),
|
||||
CS | win32con.WS_TABSTOP | win32con.ES_AUTOHSCROLL | win32con.WS_BORDER,
|
||||
]
|
||||
)
|
||||
tmp.append(
|
||||
[
|
||||
BUTTON,
|
||||
"...",
|
||||
110,
|
||||
(182, 20, 16, 11),
|
||||
CS | win32con.BS_PUSHBUTTON | win32con.WS_TABSTOP,
|
||||
]
|
||||
)
|
||||
tmp.append([STATIC, "Options:", -1, (7, 33, 50, 9), CS])
|
||||
tmp.append(
|
||||
[
|
||||
EDIT,
|
||||
fp,
|
||||
101,
|
||||
(52, 33, 128, 11),
|
||||
CS | win32con.WS_TABSTOP | win32con.ES_AUTOHSCROLL | win32con.WS_BORDER,
|
||||
]
|
||||
)
|
||||
tmp.append(
|
||||
[
|
||||
BUTTON,
|
||||
"...",
|
||||
111,
|
||||
(182, 33, 16, 11),
|
||||
CS | win32con.BS_PUSHBUTTON | win32con.WS_TABSTOP,
|
||||
]
|
||||
)
|
||||
# tmp.append([BUTTON,'Case sensitive', 104, (7, 45, 72, 9), CS | win32con.BS_AUTOCHECKBOX | win32con.BS_LEFTTEXT| win32con.WS_TABSTOP])
|
||||
# tmp.append([BUTTON,'Subdirectories', 105, (7, 56, 72, 9), CS | win32con.BS_AUTOCHECKBOX | win32con.BS_LEFTTEXT| win32con.WS_TABSTOP])
|
||||
# tmp.append([BUTTON,'Verbose', 106, (7, 67, 72, 9), CS | win32con.BS_AUTOCHECKBOX | win32con.BS_LEFTTEXT| win32con.WS_TABSTOP])
|
||||
tmp.append(
|
||||
[
|
||||
BUTTON,
|
||||
"OK",
|
||||
win32con.IDOK,
|
||||
(166, 53, 32, 12),
|
||||
CS | win32con.BS_DEFPUSHBUTTON | win32con.WS_TABSTOP,
|
||||
]
|
||||
)
|
||||
tmp.append(
|
||||
[
|
||||
BUTTON,
|
||||
"Cancel",
|
||||
win32con.IDCANCEL,
|
||||
(166, 67, 32, 12),
|
||||
CS | win32con.BS_PUSHBUTTON | win32con.WS_TABSTOP,
|
||||
]
|
||||
)
|
||||
dialog.Dialog.__init__(self, tmp)
|
||||
self.AddDDX(101, "greppattern")
|
||||
self.AddDDX(102, "dirpattern")
|
||||
self.AddDDX(103, "filpattern")
|
||||
# self.AddDDX(104,'casesensitive')
|
||||
# self.AddDDX(105,'recursive')
|
||||
# self.AddDDX(106,'verbose')
|
||||
self._obj_.data["greppattern"] = gp
|
||||
self._obj_.data["dirpattern"] = dp
|
||||
self._obj_.data["filpattern"] = fp
|
||||
# self._obj_.data['casesensitive'] = cs
|
||||
# self._obj_.data['recursive'] = r
|
||||
# self._obj_.data['verbose'] = v
|
||||
self.HookCommand(self.OnMoreDirectories, 110)
|
||||
self.HookCommand(self.OnMoreFiles, 111)
|
||||
|
||||
def OnMoreDirectories(self, cmd, code):
|
||||
self.getMore("Pychecker\\Directories", "dirpattern")
|
||||
|
||||
def OnMoreFiles(self, cmd, code):
|
||||
self.getMore("Pychecker\\File Types", "filpattern")
|
||||
|
||||
def getMore(self, section, key):
|
||||
self.UpdateData(1)
|
||||
# get the items out of the ini file
|
||||
ini = win32ui.GetProfileFileName()
|
||||
secitems = win32api.GetProfileSection(section, ini)
|
||||
items = []
|
||||
for secitem in secitems:
|
||||
items.append(secitem.split("=")[1])
|
||||
dlg = TheParamsDialog(items)
|
||||
if dlg.DoModal() == win32con.IDOK:
|
||||
itemstr = ";".join(dlg.getItems())
|
||||
self._obj_.data[key] = itemstr
|
||||
# update the ini file with dlg.getNew()
|
||||
i = 0
|
||||
newitems = dlg.getNew()
|
||||
if newitems:
|
||||
items = items + newitems
|
||||
for item in items:
|
||||
win32api.WriteProfileVal(section, repr(i), item, ini)
|
||||
i = i + 1
|
||||
self.UpdateData(0)
|
||||
|
||||
def OnOK(self):
|
||||
self.UpdateData(1)
|
||||
for id, name in (
|
||||
(101, "greppattern"),
|
||||
(102, "dirpattern"),
|
||||
(103, "filpattern"),
|
||||
):
|
||||
if not self[name]:
|
||||
self.GetDlgItem(id).SetFocus()
|
||||
win32api.MessageBeep()
|
||||
win32ui.SetStatusText("Please enter a value")
|
||||
return
|
||||
self._obj_.OnOK()
|
||||
|
||||
|
||||
class TheParamsDialog(dialog.Dialog):
|
||||
def __init__(self, items):
|
||||
self.items = items
|
||||
self.newitems = []
|
||||
style = (
|
||||
win32con.DS_MODALFRAME
|
||||
| win32con.WS_POPUP
|
||||
| win32con.WS_VISIBLE
|
||||
| win32con.WS_CAPTION
|
||||
| win32con.WS_SYSMENU
|
||||
| win32con.DS_SETFONT
|
||||
)
|
||||
CS = win32con.WS_CHILD | win32con.WS_VISIBLE
|
||||
tmp = [
|
||||
[
|
||||
"Pychecker Parameters",
|
||||
(0, 0, 205, 100),
|
||||
style,
|
||||
None,
|
||||
(8, "MS Sans Serif"),
|
||||
],
|
||||
]
|
||||
tmp.append(
|
||||
[
|
||||
LISTBOX,
|
||||
"",
|
||||
107,
|
||||
(7, 7, 150, 72),
|
||||
CS
|
||||
| win32con.LBS_MULTIPLESEL
|
||||
| win32con.LBS_STANDARD
|
||||
| win32con.LBS_HASSTRINGS
|
||||
| win32con.WS_TABSTOP
|
||||
| win32con.LBS_NOTIFY,
|
||||
]
|
||||
)
|
||||
tmp.append(
|
||||
[
|
||||
BUTTON,
|
||||
"OK",
|
||||
win32con.IDOK,
|
||||
(167, 7, 32, 12),
|
||||
CS | win32con.BS_DEFPUSHBUTTON | win32con.WS_TABSTOP,
|
||||
]
|
||||
)
|
||||
tmp.append(
|
||||
[
|
||||
BUTTON,
|
||||
"Cancel",
|
||||
win32con.IDCANCEL,
|
||||
(167, 23, 32, 12),
|
||||
CS | win32con.BS_PUSHBUTTON | win32con.WS_TABSTOP,
|
||||
]
|
||||
)
|
||||
tmp.append([STATIC, "New:", -1, (2, 83, 15, 12), CS])
|
||||
tmp.append(
|
||||
[
|
||||
EDIT,
|
||||
"",
|
||||
108,
|
||||
(18, 83, 139, 12),
|
||||
CS | win32con.WS_TABSTOP | win32con.ES_AUTOHSCROLL | win32con.WS_BORDER,
|
||||
]
|
||||
)
|
||||
tmp.append(
|
||||
[
|
||||
BUTTON,
|
||||
"Add",
|
||||
109,
|
||||
(167, 83, 32, 12),
|
||||
CS | win32con.BS_PUSHBUTTON | win32con.WS_TABSTOP,
|
||||
]
|
||||
)
|
||||
dialog.Dialog.__init__(self, tmp)
|
||||
self.HookCommand(self.OnAddItem, 109)
|
||||
self.HookCommand(self.OnListDoubleClick, 107)
|
||||
|
||||
def OnInitDialog(self):
|
||||
lb = self.GetDlgItem(107)
|
||||
for item in self.items:
|
||||
lb.AddString(item)
|
||||
return self._obj_.OnInitDialog()
|
||||
|
||||
def OnAddItem(self, cmd, code):
|
||||
eb = self.GetDlgItem(108)
|
||||
item = eb.GetLine(0)
|
||||
self.newitems.append(item)
|
||||
lb = self.GetDlgItem(107)
|
||||
i = lb.AddString(item)
|
||||
lb.SetSel(i, 1)
|
||||
return 1
|
||||
|
||||
def OnListDoubleClick(self, cmd, code):
|
||||
if code == win32con.LBN_DBLCLK:
|
||||
self.OnOK()
|
||||
return 1
|
||||
|
||||
def OnOK(self):
|
||||
lb = self.GetDlgItem(107)
|
||||
self.selections = lb.GetSelTextItems()
|
||||
self._obj_.OnOK()
|
||||
|
||||
def getItems(self):
|
||||
return self.selections
|
||||
|
||||
def getNew(self):
|
||||
return self.newitems
|
||||
|
||||
|
||||
try:
|
||||
win32ui.GetApp().RemoveDocTemplate(greptemplate)
|
||||
except NameError:
|
||||
pass
|
||||
|
||||
greptemplate = TheTemplate()
|
Loading…
Add table
Add a link
Reference in a new issue