From 9a420560cf6bcde4f97ad3ae0c79ae260a594d38 Mon Sep 17 00:00:00 2001 From: Avasam Date: Sat, 27 Jul 2024 04:02:08 -0400 Subject: [PATCH 1/4] mypy: resolve many str-format, has-type, valid-type, var-annotated, valid-type, type-var --- AutoDuck/makedfromi.py | 2 +- AutoDuck/py2d.py | 4 ++-- Pythonwin/pywin/debugger/dbgcon.py | 2 +- Pythonwin/pywin/framework/help.py | 2 +- Pythonwin/pywin/framework/interact.py | 2 +- Pythonwin/pywin/framework/mdi_pychecker.py | 14 ++++++------- Pythonwin/pywin/framework/scriptutils.py | 7 +++---- Pythonwin/pywin/framework/winout.py | 4 ++-- Pythonwin/pywin/mfc/dialog.py | 8 +++---- Pythonwin/pywin/scintilla/config.py | 8 ++++--- Pythonwin/pywin/scintilla/view.py | 18 +++++++--------- com/win32com/client/dynamic.py | 2 +- com/win32com/client/gencache.py | 6 ++---- com/win32comext/axdebug/codecontainer.py | 6 ++++-- com/win32comext/axscript/client/pyscript.py | 5 ++++- mypy.ini | 20 ++++++++++++++++-- win32/Lib/win32pdhquery.py | 23 +++++++++++---------- win32/Lib/win32pdhutil.py | 4 ++-- win32/Lib/win32serviceutil.py | 19 +++++++++-------- 19 files changed, 85 insertions(+), 71 deletions(-) diff --git a/AutoDuck/makedfromi.py b/AutoDuck/makedfromi.py index 4fd2f44acb..ef6ea93451 100644 --- a/AutoDuck/makedfromi.py +++ b/AutoDuck/makedfromi.py @@ -32,7 +32,7 @@ def GetComments(line, lineNo, lines): def make_doc_summary(inFile, outFile): - methods = [] + methods: list[tuple[str, list[str]]] = [] modDoc = "" modName = "" lines = inFile.readlines() diff --git a/AutoDuck/py2d.py b/AutoDuck/py2d.py index 6a0452bf72..63f2fcb3cd 100644 --- a/AutoDuck/py2d.py +++ b/AutoDuck/py2d.py @@ -52,8 +52,8 @@ def should_build_function(build_info): # docstring aware paragraph generator. Isn't there something in docutils # we can use? -def gen_paras(val): - chunks = [] +def gen_paras(val: str): + chunks: list[str] = [] in_docstring = False for line in val.splitlines(): line = ad_escape(line.strip()) diff --git a/Pythonwin/pywin/debugger/dbgcon.py b/Pythonwin/pywin/debugger/dbgcon.py index 402ec64b35..44046eca2e 100644 --- a/Pythonwin/pywin/debugger/dbgcon.py +++ b/Pythonwin/pywin/debugger/dbgcon.py @@ -21,7 +21,7 @@ def DoGetOption(optsDict, optName, default): def LoadDebuggerOptions(): - opts = {} + opts: dict[str, str] = {} DoGetOption(opts, OPT_HIDE, 0) DoGetOption(opts, OPT_STOP_EXCEPTIONS, 1) return opts diff --git a/Pythonwin/pywin/framework/help.py b/Pythonwin/pywin/framework/help.py index a042b18658..f38bf78956 100644 --- a/Pythonwin/pywin/framework/help.py +++ b/Pythonwin/pywin/framework/help.py @@ -79,7 +79,7 @@ def ListAllHelpFiles(): def _ListAllHelpFilesInRoot(root): """Returns a list of (helpDesc, helpFname) for all registered help files""" - retList = [] + retList: list[tuple[str, str]] = [] try: key = win32api.RegOpenKey( root, regutil.BuildDefaultPythonKey() + "\\Help", 0, win32con.KEY_READ diff --git a/Pythonwin/pywin/framework/interact.py b/Pythonwin/pywin/framework/interact.py index d93934e0e0..102e5cbf5e 100644 --- a/Pythonwin/pywin/framework/interact.py +++ b/Pythonwin/pywin/framework/interact.py @@ -482,7 +482,7 @@ def GetBlockBoundary(self, lineNo): def ExtractCommand(self, lines): start, end = lines - retList = [] + retList: list[str] = [] while end >= start: thisLine = self.DoGetLine(end) promptLen = len(GetPromptPrefix(thisLine)) diff --git a/Pythonwin/pywin/framework/mdi_pychecker.py b/Pythonwin/pywin/framework/mdi_pychecker.py index 03e5e220f1..220949a8dc 100644 --- a/Pythonwin/pywin/framework/mdi_pychecker.py +++ b/Pythonwin/pywin/framework/mdi_pychecker.py @@ -61,18 +61,18 @@ def getsubdirs(d): class dirpath: def __init__(self, str, recurse=0): dp = str.split(";") - dirs = {} + dirs = set() for d in dp: if os.path.isdir(d): d = d.lower() if d not in dirs: - dirs[d] = None + dirs.add(d) if recurse: subdirs = getsubdirs(d) for sd in subdirs: sd = sd.lower() if sd not in dirs: - dirs[sd] = None + dirs.add(sd) elif os.path.isfile(d): pass else: @@ -105,16 +105,14 @@ def __init__(self, str, recurse=0): if x: for xd in x: if xd not in dirs: - dirs[xd] = None + dirs.add(xd) 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) + dirs.add(sd) + self.dirs = list(dirs) def __getitem__(self, key): return self.dirs[key] diff --git a/Pythonwin/pywin/framework/scriptutils.py b/Pythonwin/pywin/framework/scriptutils.py index 98c34b4778..e3cc310d44 100644 --- a/Pythonwin/pywin/framework/scriptutils.py +++ b/Pythonwin/pywin/framework/scriptutils.py @@ -441,7 +441,7 @@ def ImportFile(): # meaning sys.modules can change as a side-effect of looking at # module.__file__ - so we must take a copy (ie, list(items())) for key, mod in list(sys.modules.items()): - if getattr(mod, "__file__", None): + if hasattr(mod, "__file__") and mod.__file__: fname = mod.__file__ base, ext = os.path.splitext(fname) if ext.lower() in (".pyo", ".pyc"): @@ -549,14 +549,13 @@ def RunTabNanny(filename): data = newout.getvalue() if data: try: - lineno = data.split()[1] - lineno = int(lineno) + lineno = int(data.split()[1]) _JumpToPosition(filename, lineno) try: # Try and display whitespace GetActiveEditControl().SCISetViewWS(1) except: pass - win32ui.SetStatusText("The TabNanny found trouble at line %d" % lineno) + win32ui.SetStatusText(f"The TabNanny found trouble at line {lineno}") except (IndexError, TypeError, ValueError): print("The tab nanny complained, but I can't see where!") print(data) diff --git a/Pythonwin/pywin/framework/winout.py b/Pythonwin/pywin/framework/winout.py index c98c98ff85..6be5a60014 100644 --- a/Pythonwin/pywin/framework/winout.py +++ b/Pythonwin/pywin/framework/winout.py @@ -380,7 +380,7 @@ def __init__( self.iniSizeSection = None self.defSize = defSize self.currentView = None - self.outputQueue = queue.Queue(-1) + self.outputQueue: queue.Queue[str] = queue.Queue(-1) self.mainThreadId = win32api.GetCurrentThreadId() self.idleHandlerSet = 0 self.SetIdleHandler() @@ -520,7 +520,7 @@ def QueueFlush(self, max=None): self.currentView.dowrite("".join(items)) return rc - def HandleOutput(self, message): + def HandleOutput(self, message: str): # debug("QueueOutput on thread %d, flags %d with '%s'...\n" % (win32api.GetCurrentThreadId(), self.writeQueueing, message )) self.outputQueue.put(message) if win32api.GetCurrentThreadId() != self.mainThreadId: diff --git a/Pythonwin/pywin/mfc/dialog.py b/Pythonwin/pywin/mfc/dialog.py index 93a5ba6504..7caa44eb1e 100644 --- a/Pythonwin/pywin/mfc/dialog.py +++ b/Pythonwin/pywin/mfc/dialog.py @@ -258,13 +258,11 @@ def GetSimpleInput(prompt, defValue="", title=None): # uses a simple dialog to return a string object. if title is None: title = win32ui.GetMainFrame().GetWindowText() - # 2to3 insists on converting 'Dialog.__init__' to 'tkinter.dialog...' - DlgBaseClass = Dialog - class DlgSimpleInput(DlgBaseClass): + class DlgSimpleInput(Dialog): def __init__(self, prompt, defValue, title): self.title = title - DlgBaseClass.__init__(self, win32ui.IDD_SIMPLE_INPUT) + Dialog.__init__(self, win32ui.IDD_SIMPLE_INPUT) self.AddDDX(win32ui.IDC_EDIT1, "result") self.AddDDX(win32ui.IDC_PROMPT1, "prompt") self._obj_.data["result"] = defValue @@ -272,7 +270,7 @@ def __init__(self, prompt, defValue, title): def OnInitDialog(self): self.SetWindowText(self.title) - return DlgBaseClass.OnInitDialog(self) + return Dialog.OnInitDialog(self) dlg = DlgSimpleInput(prompt, defValue, title) if dlg.DoModal() != win32con.IDOK: diff --git a/Pythonwin/pywin/scintilla/config.py b/Pythonwin/pywin/scintilla/config.py index 6f5a6396fd..f93d96402e 100644 --- a/Pythonwin/pywin/scintilla/config.py +++ b/Pythonwin/pywin/scintilla/config.py @@ -8,6 +8,8 @@ # .py file, and put the config info in a docstring. Then # pass a CStringIO file (rather than a filename) to the # config manager. +from __future__ import annotations + import glob import importlib.util import marshal @@ -35,14 +37,14 @@ def trace(*args): compiled_config_version = 3 -def split_line(line, lineno): +def split_line(line: str, lineno: int): comment_pos = line.find("#") if comment_pos >= 0: line = line[:comment_pos] sep_pos = line.rfind("=") if sep_pos == -1: if line.strip(): - print("Warning: Line %d: %s is an invalid entry" % (lineno, repr(line))) + print(f"Warning: Line {lineno}: {line!r} is an invalid entry") return None, None return "", "" return line[:sep_pos].strip(), line[sep_pos + 1 :].strip() @@ -271,7 +273,7 @@ def _save_data(self, name, data): return data def _load_general(self, sub_section, fp, lineno): - map = {} + map: dict[str, list[str | None]] = {} while 1: line, lineno, bBreak = self._readline(fp, lineno) if bBreak: diff --git a/Pythonwin/pywin/scintilla/view.py b/Pythonwin/pywin/scintilla/view.py index e941487509..68a28910ea 100644 --- a/Pythonwin/pywin/scintilla/view.py +++ b/Pythonwin/pywin/scintilla/view.py @@ -462,12 +462,6 @@ def SaveTextFile(self, filename, encoding=None): return 1 def _AutoComplete(self): - def list2dict(l): - ret = {} - for i in l: - ret[i] = None - return ret - self.SCIAutoCCancel() # Cancel old auto-complete lists. # First try and get an object without evaluating calls ob = self._GetObjectAtPos(bAllowCalls=0) @@ -480,17 +474,19 @@ def list2dict(l): # extra attributes of win32ui objects if hasattr(ob, "_obj_"): try: - items_dict.update(list2dict(dir(ob._obj_))) + items_dict.update(dict.fromkeys(dir(ob._obj_))) except AttributeError: pass # object has no __dict__ # normal attributes try: - items_dict.update(list2dict(dir(ob))) + items_dict.update(dict.fromkeys(dir(ob))) except AttributeError: pass # object has no __dict__ if hasattr(ob, "__class__"): - items_dict.update(list2dict(_get_class_attributes(ob.__class__))) + items_dict.update( + dict.fromkeys(_get_class_attributes(ob.__class__)) + ) # The object may be a COM object with typelib support - let's see if we can get its props. # (contributed by Stefan Migowsky) try: @@ -672,8 +668,8 @@ def _GetWordSplit(self, pos=-1, bAllowCalls=0): if pos == -1: pos = self.GetSel()[0] - 1 # Character before current one limit = self.GetTextLength() - before = [] - after = [] + before: list[str] = [] + after: list[str] = [] index = pos - 1 wordbreaks_use = wordbreaks if bAllowCalls: diff --git a/com/win32com/client/dynamic.py b/com/win32com/client/dynamic.py index ffe7e9e26b..fc0208a1df 100644 --- a/com/win32com/client/dynamic.py +++ b/com/win32com/client/dynamic.py @@ -409,7 +409,7 @@ def _make_method_(self, name): # self._print_details_() codeObject = compile(methodCode, "" % self._username_, "exec") # Exec the code object - tempNameSpace = {} + tempNameSpace: dict[str, object] = {} # "Dispatch" in the exec'd code is win32com.client.Dispatch, not ours. globNameSpace = globals().copy() globNameSpace["Dispatch"] = win32com.client.Dispatch diff --git a/com/win32com/client/gencache.py b/com/win32com/client/gencache.py index 3854785615..06720ab161 100644 --- a/com/win32com/client/gencache.py +++ b/com/win32com/client/gencache.py @@ -760,10 +760,8 @@ def Rebuild(verbose=1): def _Dump(): print("Cache is in directory", win32com.__gen_path__) # Build a unique dir - d = {} - for clsid, (typelibCLSID, lcid, major, minor) in clsidToTypelib.items(): - d[typelibCLSID, lcid, major, minor] = None - for typelibCLSID, lcid, major, minor in d.keys(): + d = set(clsidToTypelib.values()) + for typelibCLSID, lcid, major, minor in d: mod = GetModuleForTypelib(typelibCLSID, lcid, major, minor) print(f"{mod.__doc__} - {typelibCLSID}") diff --git a/com/win32comext/axdebug/codecontainer.py b/com/win32comext/axdebug/codecontainer.py index d82ee00089..5d543b1b7a 100644 --- a/com/win32comext/axdebug/codecontainer.py +++ b/com/win32comext/axdebug/codecontainer.py @@ -4,6 +4,8 @@ to color the text, and also how to translate lines into offsets, and back. """ +from __future__ import annotations + import os import sys import tokenize @@ -124,7 +126,7 @@ def _ProcessToken(self, type, token, spos, epos, line): erow, ecol = epos self.GetText() # Prime us. linenum = srow - 1 # Lines zero based for us too. - realCharPos = self.lineOffsets[linenum] + scol + realCharPos: int = self.lineOffsets[linenum] + scol numskipped = realCharPos - self.lastPos if numskipped == 0: pass @@ -157,7 +159,7 @@ def _ProcessToken(self, type, token, spos, epos, line): def GetSyntaxColorAttributes(self): self.lastPos = 0 - self.attrs = [] + self.attrs: list[tuple[int] | tuple[int, int]] = [] try: for tokens in tokenize.tokenize(self.GetNextLine): self._ProcessToken(*tokens) diff --git a/com/win32comext/axscript/client/pyscript.py b/com/win32comext/axscript/client/pyscript.py index 5bf46eb801..53744b8d29 100644 --- a/com/win32comext/axscript/client/pyscript.py +++ b/com/win32comext/axscript/client/pyscript.py @@ -7,8 +7,11 @@ command line. """ +from __future__ import annotations + import re import types +from typing import Any, Callable, Sequence import pythoncom import win32api @@ -291,7 +294,7 @@ def GetScriptDispatch(self, name): ) return self.scriptDispatch - def MakeEventMethodName(self, subItemName, eventName): + def MakeEventMethodName(self, subItemName: str, eventName: str): return ( subItemName[0].upper() + subItemName[1:] diff --git a/mypy.ini b/mypy.ini index a93198a2f6..bfadecedec 100644 --- a/mypy.ini +++ b/mypy.ini @@ -32,8 +32,24 @@ disable_error_code = misc, ; Name "..." is not defined; (IDEM, leave undefined/unbound to Flake8/Ruff/pyright) name-defined, - ; Cannot assign to a method (we do lots of monkey patching) - method-assign, + ; These are the other error codes that would currently fail with check_untyped_defs = true + ; TODO: Gradually fix them until we can turn on check_untyped_defs + ; arg-type, + ; assignment, + ; call-arg, + ; comparison-overlap, + ; has-type, + ; index, + ; list-item, + ; operator, + ; override, + ; type-var, + ; union-attr, + ; var-annotated, + ; ; And these only happen when checking against types-pywin32 + ; func-returns-value, + ; call-overload, + ; no-redef, exclude = (?x)( ^build/ ; Vendored diff --git a/win32/Lib/win32pdhquery.py b/win32/Lib/win32pdhquery.py index 3f458e0a88..f5900b45f7 100644 --- a/win32/Lib/win32pdhquery.py +++ b/win32/Lib/win32pdhquery.py @@ -124,10 +124,12 @@ """ # Feb 12, 98 - MH added "rawaddcounter" so caller can get exception details. +from __future__ import annotations import _thread import copy import time +from itertools import chain import win32api import win32pdh @@ -446,14 +448,11 @@ def getinstpaths( cur += 1 except IndexError: # if we went over the end pass - paths = [] - for ind in range(len(temp)): - # can this raise an error? - paths.append( - win32pdh.MakeCounterPath( - (machine, "Process", object, None, ind, counter) - ) - ) + paths = [ + win32pdh.MakeCounterPath((machine, "Process", object, None, ind, counter)) + for ind in range(len(temp)) + ] + return paths # should also return the number of elements for naming purposes def open(self, *args, **namedargs): @@ -468,9 +467,11 @@ def open(self, *args, **namedargs): # do all the normal opening stuff, self._base is now the query object BaseQuery.open(*(self,) + args, **namedargs) # should rewrite getinstpaths to take a single tuple - paths = [] - for tup in self.volatilecounters: - paths[len(paths) :] = self.getinstpaths(*tup) + paths = list( + chain.from_iterable( + self.getinstpaths(*tup) for tup in self.volatilecounters + ) + ) for path in paths: try: self.counters.append(win32pdh.AddCounter(self._base, path)) diff --git a/win32/Lib/win32pdhutil.py b/win32/Lib/win32pdhutil.py index bc966412f3..102ace27a4 100644 --- a/win32/Lib/win32pdhutil.py +++ b/win32/Lib/win32pdhutil.py @@ -100,7 +100,7 @@ def FindPerformanceAttributesByName( instanceName = instanceName.lower() items, instances = win32pdh.EnumObjectItems(None, None, object, -1) # Track multiple instances. - instance_dict = {} + instance_dict: dict[str, int] = {} for instance in instances: try: instance_dict[instance] += 1 @@ -125,7 +125,7 @@ def ShowAllProcesses(): None, None, object, win32pdh.PERF_DETAIL_WIZARD ) # Need to track multiple instances of the same name. - instance_dict = {} + instance_dict: dict[str, int] = {} for instance in instances: try: instance_dict[instance] += 1 diff --git a/win32/Lib/win32serviceutil.py b/win32/Lib/win32serviceutil.py index 5601e13eb1..363d2b17ff 100644 --- a/win32/Lib/win32serviceutil.py +++ b/win32/Lib/win32serviceutil.py @@ -5,6 +5,7 @@ # (which is win32service.error, pywintypes.error, etc) # when things go wrong - eg, not enough permissions to hit the # registry etc. +from __future__ import annotations import importlib.machinery import os @@ -441,8 +442,8 @@ def ControlService(serviceName, code, machine=None): return status -def __FindSvcDeps(findName): - dict = {} +def __FindSvcDeps(findName: str): + deps_dict: dict[str, list[str]] = {} k = win32api.RegOpenKey( win32con.HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services" ) @@ -460,19 +461,19 @@ def __FindSvcDeps(findName): deps = () for dep in deps: dep = dep.lower() - dep_on = dict.get(dep, []) + dep_on = deps_dict.get(dep, []) dep_on.append(svc) - dict[dep] = dep_on + deps_dict[dep] = dep_on - return __ResolveDeps(findName, dict) + return __ResolveDeps(findName, deps_dict) -def __ResolveDeps(findName, dict): - items = dict.get(findName.lower(), []) - retList = [] +def __ResolveDeps(findName: str, deps_dict: dict[str, list[str]]): + items = deps_dict.get(findName.lower(), []) + retList: list[str] = [] for svc in items: retList.insert(0, svc) - retList = __ResolveDeps(svc, dict) + retList + retList = __ResolveDeps(svc, deps_dict) + retList return retList From 140050bc4c3c1ba278051499e812bae979f29331 Mon Sep 17 00:00:00 2001 From: Avasam Date: Sat, 27 Jul 2024 04:08:31 -0400 Subject: [PATCH 2/4] CI checkers --- Pythonwin/pywin/framework/intpyapp.py | 2 +- com/win32comext/axscript/client/pyscript.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Pythonwin/pywin/framework/intpyapp.py b/Pythonwin/pywin/framework/intpyapp.py index acbd34cc1f..201cf95f0f 100644 --- a/Pythonwin/pywin/framework/intpyapp.py +++ b/Pythonwin/pywin/framework/intpyapp.py @@ -29,7 +29,7 @@ def _SetupSharedMenu_(self): from pywin.mfc import docview -docview.DocTemplate._SetupSharedMenu_ = _SetupSharedMenu_ +docview.DocTemplate._SetupSharedMenu_ = _SetupSharedMenu_ # type: ignore[method-assign] class MainFrame(app.MainFrame): diff --git a/com/win32comext/axscript/client/pyscript.py b/com/win32comext/axscript/client/pyscript.py index 53744b8d29..17ac1e97b4 100644 --- a/com/win32comext/axscript/client/pyscript.py +++ b/com/win32comext/axscript/client/pyscript.py @@ -11,7 +11,6 @@ import re import types -from typing import Any, Callable, Sequence import pythoncom import win32api From dba71c36132a84cab114af65bebb4f2bce55b7be Mon Sep 17 00:00:00 2001 From: Avasam Date: Mon, 4 May 2026 14:24:04 -0400 Subject: [PATCH 3/4] git mv Pythonwin pythonwin --- {Pythonwin => pythonwin}/License.txt | 0 {Pythonwin => pythonwin}/Scintilla/License.txt | 0 {Pythonwin => pythonwin}/Scintilla/README | 0 .../Scintilla/README_pythonwin.md | 0 {Pythonwin => pythonwin}/Scintilla/include/ILexer.h | 0 .../Scintilla/include/ILoader.h | 0 .../Scintilla/include/Platform.h | 0 .../Scintilla/include/SciLexer.h | 0 .../Scintilla/include/Sci_Position.h | 0 .../Scintilla/include/Scintilla.h | 0 .../Scintilla/include/Scintilla.iface | 0 .../Scintilla/include/ScintillaWidget.h | 0 .../Scintilla/lexers/LexA68k.cxx | 0 .../Scintilla/lexers/LexAPDL.cxx | 0 .../Scintilla/lexers/LexASY.cxx | 0 .../Scintilla/lexers/LexAU3.cxx | 0 .../Scintilla/lexers/LexAVE.cxx | 0 .../Scintilla/lexers/LexAVS.cxx | 0 .../Scintilla/lexers/LexAbaqus.cxx | 0 .../Scintilla/lexers/LexAda.cxx | 0 .../Scintilla/lexers/LexAsm.cxx | 0 .../Scintilla/lexers/LexAsn1.cxx | 0 .../Scintilla/lexers/LexBaan.cxx | 0 .../Scintilla/lexers/LexBash.cxx | 0 .../Scintilla/lexers/LexBasic.cxx | 0 .../Scintilla/lexers/LexBatch.cxx | 0 .../Scintilla/lexers/LexBibTeX.cxx | 0 .../Scintilla/lexers/LexBullant.cxx | 0 .../Scintilla/lexers/LexCIL.cxx | 0 .../Scintilla/lexers/LexCLW.cxx | 0 .../Scintilla/lexers/LexCOBOL.cxx | 0 .../Scintilla/lexers/LexCPP.cxx | 0 .../Scintilla/lexers/LexCSS.cxx | 0 .../Scintilla/lexers/LexCaml.cxx | 0 .../Scintilla/lexers/LexCmake.cxx | 0 .../Scintilla/lexers/LexCoffeeScript.cxx | 0 .../Scintilla/lexers/LexConf.cxx | 0 .../Scintilla/lexers/LexCrontab.cxx | 0 .../Scintilla/lexers/LexCsound.cxx | 0 {Pythonwin => pythonwin}/Scintilla/lexers/LexD.cxx | 0 .../Scintilla/lexers/LexDMAP.cxx | 0 .../Scintilla/lexers/LexDMIS.cxx | 0 .../Scintilla/lexers/LexDataflex.cxx | 0 .../Scintilla/lexers/LexDiff.cxx | 0 .../Scintilla/lexers/LexECL.cxx | 0 .../Scintilla/lexers/LexEDIFACT.cxx | 0 .../Scintilla/lexers/LexEScript.cxx | 0 .../Scintilla/lexers/LexEiffel.cxx | 0 .../Scintilla/lexers/LexErlang.cxx | 0 .../Scintilla/lexers/LexErrorList.cxx | 0 .../Scintilla/lexers/LexFlagship.cxx | 0 .../Scintilla/lexers/LexForth.cxx | 0 .../Scintilla/lexers/LexFortran.cxx | 0 .../Scintilla/lexers/LexGAP.cxx | 0 .../Scintilla/lexers/LexGui4Cli.cxx | 0 .../Scintilla/lexers/LexHTML.cxx | 0 .../Scintilla/lexers/LexHaskell.cxx | 0 .../Scintilla/lexers/LexHex.cxx | 0 .../Scintilla/lexers/LexHollywood.cxx | 0 .../Scintilla/lexers/LexIndent.cxx | 0 .../Scintilla/lexers/LexInno.cxx | 0 .../Scintilla/lexers/LexJSON.cxx | 0 .../Scintilla/lexers/LexKVIrc.cxx | 0 .../Scintilla/lexers/LexKix.cxx | 0 .../Scintilla/lexers/LexLaTeX.cxx | 0 .../Scintilla/lexers/LexLisp.cxx | 0 .../Scintilla/lexers/LexLout.cxx | 0 .../Scintilla/lexers/LexLua.cxx | 0 .../Scintilla/lexers/LexMMIXAL.cxx | 0 .../Scintilla/lexers/LexMPT.cxx | 0 .../Scintilla/lexers/LexMSSQL.cxx | 0 .../Scintilla/lexers/LexMagik.cxx | 0 .../Scintilla/lexers/LexMake.cxx | 0 .../Scintilla/lexers/LexMarkdown.cxx | 0 .../Scintilla/lexers/LexMatlab.cxx | 0 .../Scintilla/lexers/LexMaxima.cxx | 0 .../Scintilla/lexers/LexMetapost.cxx | 0 .../Scintilla/lexers/LexModula.cxx | 0 .../Scintilla/lexers/LexMySQL.cxx | 0 .../Scintilla/lexers/LexNim.cxx | 0 .../Scintilla/lexers/LexNimrod.cxx | 0 .../Scintilla/lexers/LexNsis.cxx | 0 .../Scintilla/lexers/LexNull.cxx | 0 .../Scintilla/lexers/LexOScript.cxx | 0 .../Scintilla/lexers/LexOpal.cxx | 0 {Pythonwin => pythonwin}/Scintilla/lexers/LexPB.cxx | 0 .../Scintilla/lexers/LexPLM.cxx | 0 {Pythonwin => pythonwin}/Scintilla/lexers/LexPO.cxx | 0 .../Scintilla/lexers/LexPOV.cxx | 0 {Pythonwin => pythonwin}/Scintilla/lexers/LexPS.cxx | 0 .../Scintilla/lexers/LexPascal.cxx | 0 .../Scintilla/lexers/LexPerl.cxx | 0 .../Scintilla/lexers/LexPowerPro.cxx | 0 .../Scintilla/lexers/LexPowerShell.cxx | 0 .../Scintilla/lexers/LexProgress.cxx | 0 .../Scintilla/lexers/LexProps.cxx | 0 .../Scintilla/lexers/LexPython.cxx | 0 {Pythonwin => pythonwin}/Scintilla/lexers/LexR.cxx | 0 .../Scintilla/lexers/LexRaku.cxx | 0 .../Scintilla/lexers/LexRebol.cxx | 0 .../Scintilla/lexers/LexRegistry.cxx | 0 .../Scintilla/lexers/LexRuby.cxx | 0 .../Scintilla/lexers/LexRust.cxx | 0 .../Scintilla/lexers/LexSAS.cxx | 0 .../Scintilla/lexers/LexSML.cxx | 0 .../Scintilla/lexers/LexSQL.cxx | 0 .../Scintilla/lexers/LexSTTXT.cxx | 0 .../Scintilla/lexers/LexScriptol.cxx | 0 .../Scintilla/lexers/LexSmalltalk.cxx | 0 .../Scintilla/lexers/LexSorcus.cxx | 0 .../Scintilla/lexers/LexSpecman.cxx | 0 .../Scintilla/lexers/LexSpice.cxx | 0 .../Scintilla/lexers/LexStata.cxx | 0 .../Scintilla/lexers/LexTACL.cxx | 0 .../Scintilla/lexers/LexTADS3.cxx | 0 .../Scintilla/lexers/LexTAL.cxx | 0 .../Scintilla/lexers/LexTCL.cxx | 0 .../Scintilla/lexers/LexTCMD.cxx | 0 .../Scintilla/lexers/LexTeX.cxx | 0 .../Scintilla/lexers/LexTxt2tags.cxx | 0 {Pythonwin => pythonwin}/Scintilla/lexers/LexVB.cxx | 0 .../Scintilla/lexers/LexVHDL.cxx | 0 .../Scintilla/lexers/LexVerilog.cxx | 0 .../Scintilla/lexers/LexVisualProlog.cxx | 0 .../Scintilla/lexers/LexX12.cxx | 0 .../Scintilla/lexers/LexYAML.cxx | 0 .../Scintilla/lexlib/Accessor.cxx | 0 .../Scintilla/lexlib/Accessor.h | 0 .../Scintilla/lexlib/CatalogueModules.h | 0 .../Scintilla/lexlib/CharacterCategory.cxx | 0 .../Scintilla/lexlib/CharacterCategory.h | 0 .../Scintilla/lexlib/CharacterSet.cxx | 0 .../Scintilla/lexlib/CharacterSet.h | 0 .../Scintilla/lexlib/DefaultLexer.cxx | 0 .../Scintilla/lexlib/DefaultLexer.h | 0 .../Scintilla/lexlib/LexAccessor.h | 0 .../Scintilla/lexlib/LexerBase.cxx | 0 .../Scintilla/lexlib/LexerBase.h | 0 .../Scintilla/lexlib/LexerModule.cxx | 0 .../Scintilla/lexlib/LexerModule.h | 0 .../Scintilla/lexlib/LexerNoExceptions.cxx | 0 .../Scintilla/lexlib/LexerNoExceptions.h | 0 .../Scintilla/lexlib/LexerSimple.cxx | 0 .../Scintilla/lexlib/LexerSimple.h | 0 .../Scintilla/lexlib/OptionSet.h | 0 .../Scintilla/lexlib/PropSetSimple.cxx | 0 .../Scintilla/lexlib/PropSetSimple.h | 0 .../Scintilla/lexlib/SparseState.h | 0 .../Scintilla/lexlib/StringCopy.h | 0 .../Scintilla/lexlib/StyleContext.cxx | 0 .../Scintilla/lexlib/StyleContext.h | 0 .../Scintilla/lexlib/SubStyles.h | 0 .../Scintilla/lexlib/WordList.cxx | 0 .../Scintilla/lexlib/WordList.h | 0 .../Scintilla/makefile_pythonwin | 0 .../Scintilla/src/AutoComplete.cxx | 0 .../Scintilla/src/AutoComplete.h | 0 {Pythonwin => pythonwin}/Scintilla/src/CallTip.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/CallTip.h | 0 .../Scintilla/src/CaseConvert.cxx | 0 .../Scintilla/src/CaseConvert.h | 0 .../Scintilla/src/CaseFolder.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/CaseFolder.h | 0 .../Scintilla/src/Catalogue.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/Catalogue.h | 0 .../Scintilla/src/CellBuffer.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/CellBuffer.h | 0 .../Scintilla/src/CharClassify.cxx | 0 .../Scintilla/src/CharClassify.h | 0 .../Scintilla/src/ContractionState.cxx | 0 .../Scintilla/src/ContractionState.h | 0 {Pythonwin => pythonwin}/Scintilla/src/DBCS.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/DBCS.h | 0 .../Scintilla/src/Decoration.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/Decoration.h | 0 {Pythonwin => pythonwin}/Scintilla/src/Document.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/Document.h | 0 .../Scintilla/src/EditModel.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/EditModel.h | 0 {Pythonwin => pythonwin}/Scintilla/src/EditView.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/EditView.h | 0 {Pythonwin => pythonwin}/Scintilla/src/Editor.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/Editor.h | 0 .../Scintilla/src/ElapsedPeriod.h | 0 .../Scintilla/src/ExternalLexer.cxx | 0 .../Scintilla/src/ExternalLexer.h | 0 .../Scintilla/src/FontQuality.h | 0 .../Scintilla/src/Indicator.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/Indicator.h | 0 .../Scintilla/src/IntegerRectangle.h | 0 {Pythonwin => pythonwin}/Scintilla/src/KeyMap.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/KeyMap.h | 0 .../Scintilla/src/LineMarker.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/LineMarker.h | 0 .../Scintilla/src/MarginView.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/MarginView.h | 0 .../Scintilla/src/Partitioning.h | 0 {Pythonwin => pythonwin}/Scintilla/src/PerLine.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/PerLine.h | 0 {Pythonwin => pythonwin}/Scintilla/src/Position.h | 0 .../Scintilla/src/PositionCache.cxx | 0 .../Scintilla/src/PositionCache.h | 0 {Pythonwin => pythonwin}/Scintilla/src/RESearch.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/RESearch.h | 0 .../Scintilla/src/RunStyles.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/RunStyles.h | 0 .../Scintilla/src/SciTE.properties | 0 .../Scintilla/src/ScintillaBase.cxx | 0 .../Scintilla/src/ScintillaBase.h | 0 .../Scintilla/src/Selection.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/Selection.h | 0 .../Scintilla/src/SparseVector.h | 0 .../Scintilla/src/SplitVector.h | 0 {Pythonwin => pythonwin}/Scintilla/src/Style.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/Style.h | 0 .../Scintilla/src/UniConversion.cxx | 0 .../Scintilla/src/UniConversion.h | 0 .../Scintilla/src/UniqueString.cxx | 0 .../Scintilla/src/UniqueString.h | 0 .../Scintilla/src/ViewStyle.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/ViewStyle.h | 0 {Pythonwin => pythonwin}/Scintilla/src/XPM.cxx | 0 {Pythonwin => pythonwin}/Scintilla/src/XPM.h | 0 {Pythonwin => pythonwin}/Scintilla/win32/DepGen.py | 0 .../Scintilla/win32/HanjaDic.cxx | 0 {Pythonwin => pythonwin}/Scintilla/win32/HanjaDic.h | 0 .../Scintilla/win32/PlatWin.cxx | 0 {Pythonwin => pythonwin}/Scintilla/win32/PlatWin.h | 0 .../Scintilla/win32/SciLexer.vcxproj | 0 .../Scintilla/win32/SciTE.properties | 0 .../Scintilla/win32/ScintRes.rc | 0 .../Scintilla/win32/Scintilla.def | 0 .../Scintilla/win32/Scintilla.vcxproj | 0 .../Scintilla/win32/ScintillaDLL.cxx | 0 .../Scintilla/win32/ScintillaWin.cxx | 0 .../Scintilla/win32/ScintillaWin.h | 0 {Pythonwin => pythonwin}/Scintilla/win32/deps.mak | 0 {Pythonwin => pythonwin}/Scintilla/win32/makefile | 0 {Pythonwin => pythonwin}/Scintilla/win32/nmdeps.mak | 0 .../Scintilla/win32/scintilla.mak | 0 {Pythonwin => pythonwin}/Win32app.h | 0 {Pythonwin => pythonwin}/Win32uiHostGlue.h | 0 {Pythonwin => pythonwin}/contents.d | 0 {Pythonwin => pythonwin}/dbgthread.cpp | 0 {Pythonwin => pythonwin}/ddeconv.cpp | 0 {Pythonwin => pythonwin}/ddeitem.cpp | 0 {Pythonwin => pythonwin}/ddemodule.cpp | 0 {Pythonwin => pythonwin}/ddemodule.h | 0 {Pythonwin => pythonwin}/ddeserver.cpp | 0 {Pythonwin => pythonwin}/ddetopic.cpp | 0 {Pythonwin => pythonwin}/dibapi.cpp | 0 {Pythonwin => pythonwin}/dibapi.h | 0 {Pythonwin => pythonwin}/dllmain.cpp | 0 {Pythonwin => pythonwin}/doc/EmbeddingWin32ui.html | 0 {Pythonwin => pythonwin}/doc/architecture.html | 0 {Pythonwin => pythonwin}/doc/debugger/general.html | 0 {Pythonwin => pythonwin}/doc/debugger/index.html | 0 .../doc/debugger/postmortem.gif | Bin {Pythonwin => pythonwin}/doc/debugger/probs.html | 0 {Pythonwin => pythonwin}/doc/debugger/pythonwin.gif | Bin {Pythonwin => pythonwin}/doc/debugger/tut1.gif | Bin {Pythonwin => pythonwin}/doc/debugger/tutbp1.gif | Bin {Pythonwin => pythonwin}/doc/debugger/tutorial.html | 0 {Pythonwin => pythonwin}/doc/docview.html | 0 {Pythonwin => pythonwin}/doc/guienvironment.html | 0 {Pythonwin => pythonwin}/doc/pythonwin.gif | Bin {Pythonwin => pythonwin}/pythonRichEdit.cpp | 0 {Pythonwin => pythonwin}/pythonRichEdit.h | 0 {Pythonwin => pythonwin}/pythonRichEditCntr.cpp | 0 {Pythonwin => pythonwin}/pythonRichEditCntr.h | 0 {Pythonwin => pythonwin}/pythonRichEditDoc.cpp | 0 {Pythonwin => pythonwin}/pythonRichEditDoc.h | 0 {Pythonwin => pythonwin}/pythoncbar.h | 0 {Pythonwin => pythonwin}/pythondoc.cpp | 0 {Pythonwin => pythonwin}/pythondoc.h | 0 {Pythonwin => pythonwin}/pythonframe.h | 0 {Pythonwin => pythonwin}/pythonppage.cpp | 0 {Pythonwin => pythonwin}/pythonppage.h | 0 {Pythonwin => pythonwin}/pythonpsheet.cpp | 0 {Pythonwin => pythonwin}/pythonpsheet.h | 0 {Pythonwin => pythonwin}/pythonview.cpp | 0 {Pythonwin => pythonwin}/pythonview.h | 0 {Pythonwin => pythonwin}/pythonwin.cpp | 0 {Pythonwin => pythonwin}/pythonwin.h | 0 {Pythonwin => pythonwin}/pythonwin.rc | 0 .../pywin/Demos/app/basictimerapp.py | 0 .../pywin/Demos/app/customprint.py | 0 .../pywin/Demos/app/demoutils.py | 0 .../pywin/Demos/app/dlgappdemo.py | 0 .../pywin/Demos/app/dojobapp.py | 0 .../pywin/Demos/app/helloapp.py | 0 {Pythonwin => pythonwin}/pywin/Demos/app/readme.txt | 0 {Pythonwin => pythonwin}/pywin/Demos/cmdserver.py | 0 {Pythonwin => pythonwin}/pywin/Demos/createwin.py | 0 {Pythonwin => pythonwin}/pywin/Demos/demoutils.py | 0 {Pythonwin => pythonwin}/pywin/Demos/dibdemo.py | 0 {Pythonwin => pythonwin}/pywin/Demos/dlgtest.py | 0 {Pythonwin => pythonwin}/pywin/Demos/dyndlg.py | 0 {Pythonwin => pythonwin}/pywin/Demos/fontdemo.py | 0 {Pythonwin => pythonwin}/pywin/Demos/guidemo.py | 0 {Pythonwin => pythonwin}/pywin/Demos/hiertest.py | 0 {Pythonwin => pythonwin}/pywin/Demos/menutest.py | 0 {Pythonwin => pythonwin}/pywin/Demos/objdoc.py | 0 .../pywin/Demos/ocx/demoutils.py | 0 {Pythonwin => pythonwin}/pywin/Demos/ocx/flash.py | 0 .../pywin/Demos/ocx/msoffice.py | 0 .../pywin/Demos/ocx/ocxserialtest.py | 0 {Pythonwin => pythonwin}/pywin/Demos/ocx/ocxtest.py | 0 .../pywin/Demos/ocx/webbrowser.py | 0 {Pythonwin => pythonwin}/pywin/Demos/openGLDemo.py | 0 {Pythonwin => pythonwin}/pywin/Demos/progressbar.py | 0 {Pythonwin => pythonwin}/pywin/Demos/readme.txt | 0 {Pythonwin => pythonwin}/pywin/Demos/sliderdemo.py | 0 {Pythonwin => pythonwin}/pywin/Demos/splittst.py | 0 {Pythonwin => pythonwin}/pywin/Demos/threadedgui.py | 0 {Pythonwin => pythonwin}/pywin/Demos/toolbar.py | 0 {Pythonwin => pythonwin}/pywin/IDLE.cfg | 0 {Pythonwin => pythonwin}/pywin/__init__.py | 0 {Pythonwin => pythonwin}/pywin/debugger/__init__.py | 0 {Pythonwin => pythonwin}/pywin/debugger/configui.py | 0 {Pythonwin => pythonwin}/pywin/debugger/dbgcon.py | 0 {Pythonwin => pythonwin}/pywin/debugger/dbgpyapp.py | 0 {Pythonwin => pythonwin}/pywin/debugger/debugger.py | 0 {Pythonwin => pythonwin}/pywin/debugger/fail.py | 0 {Pythonwin => pythonwin}/pywin/default.cfg | 0 {Pythonwin => pythonwin}/pywin/dialogs/__init__.py | 0 .../pywin/dialogs/ideoptions.py | 0 {Pythonwin => pythonwin}/pywin/dialogs/list.py | 0 {Pythonwin => pythonwin}/pywin/dialogs/login.py | 0 {Pythonwin => pythonwin}/pywin/dialogs/status.py | 0 .../pywin/docking/DockingBar.py | 0 {Pythonwin => pythonwin}/pywin/docking/__init__.py | 0 .../pywin/framework/__init__.py | 0 {Pythonwin => pythonwin}/pywin/framework/app.py | 0 {Pythonwin => pythonwin}/pywin/framework/bitmap.py | 0 {Pythonwin => pythonwin}/pywin/framework/cmdline.py | 0 .../pywin/framework/dbgcommands.py | 0 .../pywin/framework/dlgappcore.py | 0 .../pywin/framework/editor/ModuleBrowser.py | 0 .../pywin/framework/editor/__init__.py | 0 .../pywin/framework/editor/color/__init__.py | 0 .../pywin/framework/editor/color/coloreditor.py | 0 .../pywin/framework/editor/configui.py | 0 .../pywin/framework/editor/document.py | 0 .../pywin/framework/editor/editor.py | 0 .../pywin/framework/editor/frame.py | 0 .../pywin/framework/editor/template.py | 0 .../pywin/framework/editor/vss.py | 0 {Pythonwin => pythonwin}/pywin/framework/help.py | 0 .../pywin/framework/interact.py | 0 .../pywin/framework/intpyapp.py | 0 .../pywin/framework/intpydde.py | 0 .../pywin/framework/scriptutils.py | 0 .../pywin/framework/sgrepmdi.py | 0 {Pythonwin => pythonwin}/pywin/framework/startup.py | 0 {Pythonwin => pythonwin}/pywin/framework/stdin.py | 0 .../pywin/framework/toolmenu.py | 0 {Pythonwin => pythonwin}/pywin/framework/window.py | 0 {Pythonwin => pythonwin}/pywin/framework/winout.py | 0 {Pythonwin => pythonwin}/pywin/idle/AutoExpand.py | 0 {Pythonwin => pythonwin}/pywin/idle/AutoIndent.py | 0 {Pythonwin => pythonwin}/pywin/idle/CallTips.py | 0 .../pywin/idle/FormatParagraph.py | 0 {Pythonwin => pythonwin}/pywin/idle/IdleHistory.py | 0 {Pythonwin => pythonwin}/pywin/idle/PyParse.py | 0 {Pythonwin => pythonwin}/pywin/idle/__init__.py | 0 {Pythonwin => pythonwin}/pywin/idle/readme.md | 0 {Pythonwin => pythonwin}/pywin/mfc/__init__.py | 0 {Pythonwin => pythonwin}/pywin/mfc/activex.py | 0 {Pythonwin => pythonwin}/pywin/mfc/afxres.py | 0 {Pythonwin => pythonwin}/pywin/mfc/dialog.py | 0 {Pythonwin => pythonwin}/pywin/mfc/docview.py | 0 {Pythonwin => pythonwin}/pywin/mfc/object.py | 0 {Pythonwin => pythonwin}/pywin/mfc/thread.py | 0 {Pythonwin => pythonwin}/pywin/mfc/window.py | 0 .../pywin/scintilla/IDLEenvironment.py | 0 .../pywin/scintilla/__init__.py | 0 .../pywin/scintilla/bindings.py | 0 {Pythonwin => pythonwin}/pywin/scintilla/config.py | 0 .../pywin/scintilla/configui.py | 0 {Pythonwin => pythonwin}/pywin/scintilla/control.py | 0 .../pywin/scintilla/document.py | 0 {Pythonwin => pythonwin}/pywin/scintilla/find.py | 0 .../pywin/scintilla/formatter.py | 0 .../pywin/scintilla/keycodes.py | 0 .../pywin/scintilla/scintillacon.py | 0 {Pythonwin => pythonwin}/pywin/scintilla/view.py | 0 {Pythonwin => pythonwin}/pywin/test/_dbgscript.py | 0 .../pywin/test/_exetestscript.py | 0 {Pythonwin => pythonwin}/pywin/test/all.py | 0 {Pythonwin => pythonwin}/pywin/test/test_exe.py | 0 {Pythonwin => pythonwin}/pywin/test/test_pywin.py | 0 .../pywin/tools/TraceCollector.py | 0 {Pythonwin => pythonwin}/pywin/tools/__init__.py | 0 .../pywin/tools/browseProjects.py | 0 {Pythonwin => pythonwin}/pywin/tools/browser.py | 0 {Pythonwin => pythonwin}/pywin/tools/hierlist.py | 0 {Pythonwin => pythonwin}/pywin/tools/regedit.py | 0 {Pythonwin => pythonwin}/pywin/tools/regpy.py | 0 {Pythonwin => pythonwin}/readme.html | 0 {Pythonwin => pythonwin}/res/BROWSER.BMP | Bin {Pythonwin => pythonwin}/res/HIERFOLD.BMP | Bin {Pythonwin => pythonwin}/res/ICO00002.ICO | Bin {Pythonwin => pythonwin}/res/IDR_MAIN.ICO | Bin {Pythonwin => pythonwin}/res/IDR_PYTH.ICO | Bin {Pythonwin => pythonwin}/res/PADDOC.ICO | Bin {Pythonwin => pythonwin}/res/debugger.ico | Bin {Pythonwin => pythonwin}/res/debugger_stack.bmp | Bin {Pythonwin => pythonwin}/res/pyc.ico | Bin {Pythonwin => pythonwin}/res/pycon.ico | Bin {Pythonwin => pythonwin}/res/temp.BMP | Bin {Pythonwin => pythonwin}/res/toolbar.bmp | Bin {Pythonwin => pythonwin}/res/toolbar_debugger.bmp | Bin {Pythonwin => pythonwin}/respw.h | 0 {Pythonwin => pythonwin}/reswin32ui.h | 0 {Pythonwin => pythonwin}/start_pythonwin.pyw | 0 {Pythonwin => pythonwin}/stdafx.cpp | 0 {Pythonwin => pythonwin}/stdafx.h | 0 {Pythonwin => pythonwin}/stdafxdde.h | 0 {Pythonwin => pythonwin}/stdafxole.cpp | 0 {Pythonwin => pythonwin}/stdafxole.h | 0 {Pythonwin => pythonwin}/stdafxpw.cpp | 0 {Pythonwin => pythonwin}/stdafxpw.h | 0 {Pythonwin => pythonwin}/stddde.cpp | 0 {Pythonwin => pythonwin}/win32ImageList.cpp | 0 {Pythonwin => pythonwin}/win32ImageList.h | 0 {Pythonwin => pythonwin}/win32RichEdit.cpp | 0 {Pythonwin => pythonwin}/win32RichEdit.h | 0 .../win32RichEditDocTemplate.cpp | 0 {Pythonwin => pythonwin}/win32RichEditDocTemplate.h | 0 {Pythonwin => pythonwin}/win32app.cpp | 0 {Pythonwin => pythonwin}/win32assoc.cpp | 0 {Pythonwin => pythonwin}/win32assoc.h | 0 {Pythonwin => pythonwin}/win32bitmap.cpp | 0 {Pythonwin => pythonwin}/win32bitmap.h | 0 {Pythonwin => pythonwin}/win32brush.cpp | 0 {Pythonwin => pythonwin}/win32brush.h | 0 {Pythonwin => pythonwin}/win32cmd.cpp | 0 {Pythonwin => pythonwin}/win32cmd.h | 0 {Pythonwin => pythonwin}/win32cmdui.cpp | 0 {Pythonwin => pythonwin}/win32cmdui.h | 0 {Pythonwin => pythonwin}/win32context.cpp | 0 {Pythonwin => pythonwin}/win32control.cpp | 0 {Pythonwin => pythonwin}/win32control.h | 0 {Pythonwin => pythonwin}/win32ctledit.cpp | 0 {Pythonwin => pythonwin}/win32ctrlList.cpp | 0 {Pythonwin => pythonwin}/win32ctrlList.h | 0 {Pythonwin => pythonwin}/win32ctrlRichEdit.cpp | 0 {Pythonwin => pythonwin}/win32ctrlTree.cpp | 0 {Pythonwin => pythonwin}/win32ctrlTree.h | 0 {Pythonwin => pythonwin}/win32dc.cpp | 0 {Pythonwin => pythonwin}/win32dc.h | 0 {Pythonwin => pythonwin}/win32dlg.cpp | 0 {Pythonwin => pythonwin}/win32dlg.h | 0 {Pythonwin => pythonwin}/win32dlgbar.cpp | 0 {Pythonwin => pythonwin}/win32dlgbar.h | 0 {Pythonwin => pythonwin}/win32dll.cpp | 0 {Pythonwin => pythonwin}/win32dll.h | 0 {Pythonwin => pythonwin}/win32doc.cpp | 0 {Pythonwin => pythonwin}/win32doc.h | 0 {Pythonwin => pythonwin}/win32font.cpp | 0 {Pythonwin => pythonwin}/win32font.h | 0 {Pythonwin => pythonwin}/win32gdi.cpp | 0 {Pythonwin => pythonwin}/win32gdi.h | 0 {Pythonwin => pythonwin}/win32hl.h | 0 {Pythonwin => pythonwin}/win32menu.cpp | 0 {Pythonwin => pythonwin}/win32menu.h | 0 {Pythonwin => pythonwin}/win32notify.cpp | 0 {Pythonwin => pythonwin}/win32oleDlgInsert.cpp | 0 {Pythonwin => pythonwin}/win32oleDlgs.cpp | 0 {Pythonwin => pythonwin}/win32oleDlgs.h | 0 {Pythonwin => pythonwin}/win32pen.cpp | 0 {Pythonwin => pythonwin}/win32pen.h | 0 {Pythonwin => pythonwin}/win32prinfo.cpp | 0 {Pythonwin => pythonwin}/win32prinfo.h | 0 {Pythonwin => pythonwin}/win32prop.cpp | 0 {Pythonwin => pythonwin}/win32prop.h | 0 {Pythonwin => pythonwin}/win32rgn.cpp | 0 {Pythonwin => pythonwin}/win32rgn.h | 0 {Pythonwin => pythonwin}/win32splitter.cpp | 0 {Pythonwin => pythonwin}/win32splitter.h | 0 {Pythonwin => pythonwin}/win32template.cpp | 0 {Pythonwin => pythonwin}/win32template.h | 0 {Pythonwin => pythonwin}/win32thread.cpp | 0 {Pythonwin => pythonwin}/win32toolbar.cpp | 0 {Pythonwin => pythonwin}/win32toolbar.h | 0 {Pythonwin => pythonwin}/win32tooltip.cpp | 0 {Pythonwin => pythonwin}/win32ui.h | 0 {Pythonwin => pythonwin}/win32ui.rc | 0 {Pythonwin => pythonwin}/win32uiExt.h | 0 {Pythonwin => pythonwin}/win32uimodule.cpp | 0 {Pythonwin => pythonwin}/win32uiole.cpp | 0 {Pythonwin => pythonwin}/win32uioleClientItem.cpp | 0 {Pythonwin => pythonwin}/win32uioledoc.cpp | 0 {Pythonwin => pythonwin}/win32uioledoc.h | 0 {Pythonwin => pythonwin}/win32util.cpp | 0 {Pythonwin => pythonwin}/win32view.cpp | 0 {Pythonwin => pythonwin}/win32virt.cpp | 0 {Pythonwin => pythonwin}/win32win.cpp | 0 {Pythonwin => pythonwin}/win32win.h | 0 500 files changed, 0 insertions(+), 0 deletions(-) rename {Pythonwin => pythonwin}/License.txt (100%) rename {Pythonwin => pythonwin}/Scintilla/License.txt (100%) rename {Pythonwin => pythonwin}/Scintilla/README (100%) rename {Pythonwin => pythonwin}/Scintilla/README_pythonwin.md (100%) rename {Pythonwin => pythonwin}/Scintilla/include/ILexer.h (100%) rename {Pythonwin => pythonwin}/Scintilla/include/ILoader.h (100%) rename {Pythonwin => pythonwin}/Scintilla/include/Platform.h (100%) rename {Pythonwin => pythonwin}/Scintilla/include/SciLexer.h (100%) rename {Pythonwin => pythonwin}/Scintilla/include/Sci_Position.h (100%) rename {Pythonwin => pythonwin}/Scintilla/include/Scintilla.h (100%) rename {Pythonwin => pythonwin}/Scintilla/include/Scintilla.iface (100%) rename {Pythonwin => pythonwin}/Scintilla/include/ScintillaWidget.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexA68k.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexAPDL.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexASY.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexAU3.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexAVE.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexAVS.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexAbaqus.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexAda.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexAsm.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexAsn1.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexBaan.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexBash.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexBasic.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexBatch.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexBibTeX.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexBullant.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexCIL.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexCLW.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexCOBOL.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexCPP.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexCSS.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexCaml.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexCmake.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexCoffeeScript.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexConf.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexCrontab.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexCsound.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexD.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexDMAP.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexDMIS.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexDataflex.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexDiff.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexECL.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexEDIFACT.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexEScript.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexEiffel.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexErlang.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexErrorList.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexFlagship.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexForth.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexFortran.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexGAP.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexGui4Cli.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexHTML.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexHaskell.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexHex.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexHollywood.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexIndent.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexInno.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexJSON.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexKVIrc.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexKix.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexLaTeX.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexLisp.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexLout.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexLua.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexMMIXAL.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexMPT.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexMSSQL.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexMagik.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexMake.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexMarkdown.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexMatlab.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexMaxima.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexMetapost.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexModula.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexMySQL.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexNim.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexNimrod.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexNsis.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexNull.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexOScript.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexOpal.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexPB.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexPLM.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexPO.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexPOV.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexPS.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexPascal.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexPerl.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexPowerPro.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexPowerShell.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexProgress.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexProps.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexPython.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexR.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexRaku.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexRebol.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexRegistry.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexRuby.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexRust.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexSAS.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexSML.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexSQL.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexSTTXT.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexScriptol.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexSmalltalk.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexSorcus.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexSpecman.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexSpice.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexStata.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexTACL.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexTADS3.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexTAL.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexTCL.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexTCMD.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexTeX.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexTxt2tags.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexVB.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexVHDL.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexVerilog.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexVisualProlog.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexX12.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexers/LexYAML.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/Accessor.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/Accessor.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/CatalogueModules.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/CharacterCategory.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/CharacterCategory.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/CharacterSet.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/CharacterSet.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/DefaultLexer.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/DefaultLexer.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/LexAccessor.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/LexerBase.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/LexerBase.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/LexerModule.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/LexerModule.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/LexerNoExceptions.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/LexerNoExceptions.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/LexerSimple.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/LexerSimple.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/OptionSet.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/PropSetSimple.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/PropSetSimple.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/SparseState.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/StringCopy.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/StyleContext.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/StyleContext.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/SubStyles.h (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/WordList.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/lexlib/WordList.h (100%) rename {Pythonwin => pythonwin}/Scintilla/makefile_pythonwin (100%) rename {Pythonwin => pythonwin}/Scintilla/src/AutoComplete.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/AutoComplete.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/CallTip.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/CallTip.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/CaseConvert.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/CaseConvert.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/CaseFolder.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/CaseFolder.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Catalogue.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Catalogue.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/CellBuffer.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/CellBuffer.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/CharClassify.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/CharClassify.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/ContractionState.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/ContractionState.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/DBCS.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/DBCS.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Decoration.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Decoration.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Document.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Document.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/EditModel.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/EditModel.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/EditView.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/EditView.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Editor.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Editor.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/ElapsedPeriod.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/ExternalLexer.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/ExternalLexer.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/FontQuality.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Indicator.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Indicator.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/IntegerRectangle.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/KeyMap.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/KeyMap.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/LineMarker.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/LineMarker.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/MarginView.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/MarginView.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Partitioning.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/PerLine.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/PerLine.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Position.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/PositionCache.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/PositionCache.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/RESearch.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/RESearch.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/RunStyles.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/RunStyles.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/SciTE.properties (100%) rename {Pythonwin => pythonwin}/Scintilla/src/ScintillaBase.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/ScintillaBase.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Selection.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Selection.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/SparseVector.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/SplitVector.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Style.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/Style.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/UniConversion.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/UniConversion.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/UniqueString.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/UniqueString.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/ViewStyle.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/ViewStyle.h (100%) rename {Pythonwin => pythonwin}/Scintilla/src/XPM.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/src/XPM.h (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/DepGen.py (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/HanjaDic.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/HanjaDic.h (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/PlatWin.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/PlatWin.h (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/SciLexer.vcxproj (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/SciTE.properties (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/ScintRes.rc (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/Scintilla.def (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/Scintilla.vcxproj (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/ScintillaDLL.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/ScintillaWin.cxx (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/ScintillaWin.h (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/deps.mak (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/makefile (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/nmdeps.mak (100%) rename {Pythonwin => pythonwin}/Scintilla/win32/scintilla.mak (100%) rename {Pythonwin => pythonwin}/Win32app.h (100%) rename {Pythonwin => pythonwin}/Win32uiHostGlue.h (100%) rename {Pythonwin => pythonwin}/contents.d (100%) rename {Pythonwin => pythonwin}/dbgthread.cpp (100%) rename {Pythonwin => pythonwin}/ddeconv.cpp (100%) rename {Pythonwin => pythonwin}/ddeitem.cpp (100%) rename {Pythonwin => pythonwin}/ddemodule.cpp (100%) rename {Pythonwin => pythonwin}/ddemodule.h (100%) rename {Pythonwin => pythonwin}/ddeserver.cpp (100%) rename {Pythonwin => pythonwin}/ddetopic.cpp (100%) rename {Pythonwin => pythonwin}/dibapi.cpp (100%) rename {Pythonwin => pythonwin}/dibapi.h (100%) rename {Pythonwin => pythonwin}/dllmain.cpp (100%) rename {Pythonwin => pythonwin}/doc/EmbeddingWin32ui.html (100%) rename {Pythonwin => pythonwin}/doc/architecture.html (100%) rename {Pythonwin => pythonwin}/doc/debugger/general.html (100%) rename {Pythonwin => pythonwin}/doc/debugger/index.html (100%) rename {Pythonwin => pythonwin}/doc/debugger/postmortem.gif (100%) rename {Pythonwin => pythonwin}/doc/debugger/probs.html (100%) rename {Pythonwin => pythonwin}/doc/debugger/pythonwin.gif (100%) rename {Pythonwin => pythonwin}/doc/debugger/tut1.gif (100%) rename {Pythonwin => pythonwin}/doc/debugger/tutbp1.gif (100%) rename {Pythonwin => pythonwin}/doc/debugger/tutorial.html (100%) rename {Pythonwin => pythonwin}/doc/docview.html (100%) rename {Pythonwin => pythonwin}/doc/guienvironment.html (100%) rename {Pythonwin => pythonwin}/doc/pythonwin.gif (100%) rename {Pythonwin => pythonwin}/pythonRichEdit.cpp (100%) rename {Pythonwin => pythonwin}/pythonRichEdit.h (100%) rename {Pythonwin => pythonwin}/pythonRichEditCntr.cpp (100%) rename {Pythonwin => pythonwin}/pythonRichEditCntr.h (100%) rename {Pythonwin => pythonwin}/pythonRichEditDoc.cpp (100%) rename {Pythonwin => pythonwin}/pythonRichEditDoc.h (100%) rename {Pythonwin => pythonwin}/pythoncbar.h (100%) rename {Pythonwin => pythonwin}/pythondoc.cpp (100%) rename {Pythonwin => pythonwin}/pythondoc.h (100%) rename {Pythonwin => pythonwin}/pythonframe.h (100%) rename {Pythonwin => pythonwin}/pythonppage.cpp (100%) rename {Pythonwin => pythonwin}/pythonppage.h (100%) rename {Pythonwin => pythonwin}/pythonpsheet.cpp (100%) rename {Pythonwin => pythonwin}/pythonpsheet.h (100%) rename {Pythonwin => pythonwin}/pythonview.cpp (100%) rename {Pythonwin => pythonwin}/pythonview.h (100%) rename {Pythonwin => pythonwin}/pythonwin.cpp (100%) rename {Pythonwin => pythonwin}/pythonwin.h (100%) rename {Pythonwin => pythonwin}/pythonwin.rc (100%) rename {Pythonwin => pythonwin}/pywin/Demos/app/basictimerapp.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/app/customprint.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/app/demoutils.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/app/dlgappdemo.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/app/dojobapp.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/app/helloapp.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/app/readme.txt (100%) rename {Pythonwin => pythonwin}/pywin/Demos/cmdserver.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/createwin.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/demoutils.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/dibdemo.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/dlgtest.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/dyndlg.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/fontdemo.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/guidemo.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/hiertest.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/menutest.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/objdoc.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/ocx/demoutils.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/ocx/flash.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/ocx/msoffice.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/ocx/ocxserialtest.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/ocx/ocxtest.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/ocx/webbrowser.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/openGLDemo.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/progressbar.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/readme.txt (100%) rename {Pythonwin => pythonwin}/pywin/Demos/sliderdemo.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/splittst.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/threadedgui.py (100%) rename {Pythonwin => pythonwin}/pywin/Demos/toolbar.py (100%) rename {Pythonwin => pythonwin}/pywin/IDLE.cfg (100%) rename {Pythonwin => pythonwin}/pywin/__init__.py (100%) rename {Pythonwin => pythonwin}/pywin/debugger/__init__.py (100%) rename {Pythonwin => pythonwin}/pywin/debugger/configui.py (100%) rename {Pythonwin => pythonwin}/pywin/debugger/dbgcon.py (100%) rename {Pythonwin => pythonwin}/pywin/debugger/dbgpyapp.py (100%) rename {Pythonwin => pythonwin}/pywin/debugger/debugger.py (100%) rename {Pythonwin => pythonwin}/pywin/debugger/fail.py (100%) rename {Pythonwin => pythonwin}/pywin/default.cfg (100%) rename {Pythonwin => pythonwin}/pywin/dialogs/__init__.py (100%) rename {Pythonwin => pythonwin}/pywin/dialogs/ideoptions.py (100%) rename {Pythonwin => pythonwin}/pywin/dialogs/list.py (100%) rename {Pythonwin => pythonwin}/pywin/dialogs/login.py (100%) rename {Pythonwin => pythonwin}/pywin/dialogs/status.py (100%) rename {Pythonwin => pythonwin}/pywin/docking/DockingBar.py (100%) rename {Pythonwin => pythonwin}/pywin/docking/__init__.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/__init__.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/app.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/bitmap.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/cmdline.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/dbgcommands.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/dlgappcore.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/editor/ModuleBrowser.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/editor/__init__.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/editor/color/__init__.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/editor/color/coloreditor.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/editor/configui.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/editor/document.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/editor/editor.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/editor/frame.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/editor/template.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/editor/vss.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/help.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/interact.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/intpyapp.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/intpydde.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/scriptutils.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/sgrepmdi.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/startup.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/stdin.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/toolmenu.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/window.py (100%) rename {Pythonwin => pythonwin}/pywin/framework/winout.py (100%) rename {Pythonwin => pythonwin}/pywin/idle/AutoExpand.py (100%) rename {Pythonwin => pythonwin}/pywin/idle/AutoIndent.py (100%) rename {Pythonwin => pythonwin}/pywin/idle/CallTips.py (100%) rename {Pythonwin => pythonwin}/pywin/idle/FormatParagraph.py (100%) rename {Pythonwin => pythonwin}/pywin/idle/IdleHistory.py (100%) rename {Pythonwin => pythonwin}/pywin/idle/PyParse.py (100%) rename {Pythonwin => pythonwin}/pywin/idle/__init__.py (100%) rename {Pythonwin => pythonwin}/pywin/idle/readme.md (100%) rename {Pythonwin => pythonwin}/pywin/mfc/__init__.py (100%) rename {Pythonwin => pythonwin}/pywin/mfc/activex.py (100%) rename {Pythonwin => pythonwin}/pywin/mfc/afxres.py (100%) rename {Pythonwin => pythonwin}/pywin/mfc/dialog.py (100%) rename {Pythonwin => pythonwin}/pywin/mfc/docview.py (100%) rename {Pythonwin => pythonwin}/pywin/mfc/object.py (100%) rename {Pythonwin => pythonwin}/pywin/mfc/thread.py (100%) rename {Pythonwin => pythonwin}/pywin/mfc/window.py (100%) rename {Pythonwin => pythonwin}/pywin/scintilla/IDLEenvironment.py (100%) rename {Pythonwin => pythonwin}/pywin/scintilla/__init__.py (100%) rename {Pythonwin => pythonwin}/pywin/scintilla/bindings.py (100%) rename {Pythonwin => pythonwin}/pywin/scintilla/config.py (100%) rename {Pythonwin => pythonwin}/pywin/scintilla/configui.py (100%) rename {Pythonwin => pythonwin}/pywin/scintilla/control.py (100%) rename {Pythonwin => pythonwin}/pywin/scintilla/document.py (100%) rename {Pythonwin => pythonwin}/pywin/scintilla/find.py (100%) rename {Pythonwin => pythonwin}/pywin/scintilla/formatter.py (100%) rename {Pythonwin => pythonwin}/pywin/scintilla/keycodes.py (100%) rename {Pythonwin => pythonwin}/pywin/scintilla/scintillacon.py (100%) rename {Pythonwin => pythonwin}/pywin/scintilla/view.py (100%) rename {Pythonwin => pythonwin}/pywin/test/_dbgscript.py (100%) rename {Pythonwin => pythonwin}/pywin/test/_exetestscript.py (100%) rename {Pythonwin => pythonwin}/pywin/test/all.py (100%) rename {Pythonwin => pythonwin}/pywin/test/test_exe.py (100%) rename {Pythonwin => pythonwin}/pywin/test/test_pywin.py (100%) rename {Pythonwin => pythonwin}/pywin/tools/TraceCollector.py (100%) rename {Pythonwin => pythonwin}/pywin/tools/__init__.py (100%) rename {Pythonwin => pythonwin}/pywin/tools/browseProjects.py (100%) rename {Pythonwin => pythonwin}/pywin/tools/browser.py (100%) rename {Pythonwin => pythonwin}/pywin/tools/hierlist.py (100%) rename {Pythonwin => pythonwin}/pywin/tools/regedit.py (100%) rename {Pythonwin => pythonwin}/pywin/tools/regpy.py (100%) rename {Pythonwin => pythonwin}/readme.html (100%) rename {Pythonwin => pythonwin}/res/BROWSER.BMP (100%) rename {Pythonwin => pythonwin}/res/HIERFOLD.BMP (100%) rename {Pythonwin => pythonwin}/res/ICO00002.ICO (100%) rename {Pythonwin => pythonwin}/res/IDR_MAIN.ICO (100%) rename {Pythonwin => pythonwin}/res/IDR_PYTH.ICO (100%) rename {Pythonwin => pythonwin}/res/PADDOC.ICO (100%) rename {Pythonwin => pythonwin}/res/debugger.ico (100%) rename {Pythonwin => pythonwin}/res/debugger_stack.bmp (100%) rename {Pythonwin => pythonwin}/res/pyc.ico (100%) rename {Pythonwin => pythonwin}/res/pycon.ico (100%) rename {Pythonwin => pythonwin}/res/temp.BMP (100%) rename {Pythonwin => pythonwin}/res/toolbar.bmp (100%) rename {Pythonwin => pythonwin}/res/toolbar_debugger.bmp (100%) rename {Pythonwin => pythonwin}/respw.h (100%) rename {Pythonwin => pythonwin}/reswin32ui.h (100%) rename {Pythonwin => pythonwin}/start_pythonwin.pyw (100%) rename {Pythonwin => pythonwin}/stdafx.cpp (100%) rename {Pythonwin => pythonwin}/stdafx.h (100%) rename {Pythonwin => pythonwin}/stdafxdde.h (100%) rename {Pythonwin => pythonwin}/stdafxole.cpp (100%) rename {Pythonwin => pythonwin}/stdafxole.h (100%) rename {Pythonwin => pythonwin}/stdafxpw.cpp (100%) rename {Pythonwin => pythonwin}/stdafxpw.h (100%) rename {Pythonwin => pythonwin}/stddde.cpp (100%) rename {Pythonwin => pythonwin}/win32ImageList.cpp (100%) rename {Pythonwin => pythonwin}/win32ImageList.h (100%) rename {Pythonwin => pythonwin}/win32RichEdit.cpp (100%) rename {Pythonwin => pythonwin}/win32RichEdit.h (100%) rename {Pythonwin => pythonwin}/win32RichEditDocTemplate.cpp (100%) rename {Pythonwin => pythonwin}/win32RichEditDocTemplate.h (100%) rename {Pythonwin => pythonwin}/win32app.cpp (100%) rename {Pythonwin => pythonwin}/win32assoc.cpp (100%) rename {Pythonwin => pythonwin}/win32assoc.h (100%) rename {Pythonwin => pythonwin}/win32bitmap.cpp (100%) rename {Pythonwin => pythonwin}/win32bitmap.h (100%) rename {Pythonwin => pythonwin}/win32brush.cpp (100%) rename {Pythonwin => pythonwin}/win32brush.h (100%) rename {Pythonwin => pythonwin}/win32cmd.cpp (100%) rename {Pythonwin => pythonwin}/win32cmd.h (100%) rename {Pythonwin => pythonwin}/win32cmdui.cpp (100%) rename {Pythonwin => pythonwin}/win32cmdui.h (100%) rename {Pythonwin => pythonwin}/win32context.cpp (100%) rename {Pythonwin => pythonwin}/win32control.cpp (100%) rename {Pythonwin => pythonwin}/win32control.h (100%) rename {Pythonwin => pythonwin}/win32ctledit.cpp (100%) rename {Pythonwin => pythonwin}/win32ctrlList.cpp (100%) rename {Pythonwin => pythonwin}/win32ctrlList.h (100%) rename {Pythonwin => pythonwin}/win32ctrlRichEdit.cpp (100%) rename {Pythonwin => pythonwin}/win32ctrlTree.cpp (100%) rename {Pythonwin => pythonwin}/win32ctrlTree.h (100%) rename {Pythonwin => pythonwin}/win32dc.cpp (100%) rename {Pythonwin => pythonwin}/win32dc.h (100%) rename {Pythonwin => pythonwin}/win32dlg.cpp (100%) rename {Pythonwin => pythonwin}/win32dlg.h (100%) rename {Pythonwin => pythonwin}/win32dlgbar.cpp (100%) rename {Pythonwin => pythonwin}/win32dlgbar.h (100%) rename {Pythonwin => pythonwin}/win32dll.cpp (100%) rename {Pythonwin => pythonwin}/win32dll.h (100%) rename {Pythonwin => pythonwin}/win32doc.cpp (100%) rename {Pythonwin => pythonwin}/win32doc.h (100%) rename {Pythonwin => pythonwin}/win32font.cpp (100%) rename {Pythonwin => pythonwin}/win32font.h (100%) rename {Pythonwin => pythonwin}/win32gdi.cpp (100%) rename {Pythonwin => pythonwin}/win32gdi.h (100%) rename {Pythonwin => pythonwin}/win32hl.h (100%) rename {Pythonwin => pythonwin}/win32menu.cpp (100%) rename {Pythonwin => pythonwin}/win32menu.h (100%) rename {Pythonwin => pythonwin}/win32notify.cpp (100%) rename {Pythonwin => pythonwin}/win32oleDlgInsert.cpp (100%) rename {Pythonwin => pythonwin}/win32oleDlgs.cpp (100%) rename {Pythonwin => pythonwin}/win32oleDlgs.h (100%) rename {Pythonwin => pythonwin}/win32pen.cpp (100%) rename {Pythonwin => pythonwin}/win32pen.h (100%) rename {Pythonwin => pythonwin}/win32prinfo.cpp (100%) rename {Pythonwin => pythonwin}/win32prinfo.h (100%) rename {Pythonwin => pythonwin}/win32prop.cpp (100%) rename {Pythonwin => pythonwin}/win32prop.h (100%) rename {Pythonwin => pythonwin}/win32rgn.cpp (100%) rename {Pythonwin => pythonwin}/win32rgn.h (100%) rename {Pythonwin => pythonwin}/win32splitter.cpp (100%) rename {Pythonwin => pythonwin}/win32splitter.h (100%) rename {Pythonwin => pythonwin}/win32template.cpp (100%) rename {Pythonwin => pythonwin}/win32template.h (100%) rename {Pythonwin => pythonwin}/win32thread.cpp (100%) rename {Pythonwin => pythonwin}/win32toolbar.cpp (100%) rename {Pythonwin => pythonwin}/win32toolbar.h (100%) rename {Pythonwin => pythonwin}/win32tooltip.cpp (100%) rename {Pythonwin => pythonwin}/win32ui.h (100%) rename {Pythonwin => pythonwin}/win32ui.rc (100%) rename {Pythonwin => pythonwin}/win32uiExt.h (100%) rename {Pythonwin => pythonwin}/win32uimodule.cpp (100%) rename {Pythonwin => pythonwin}/win32uiole.cpp (100%) rename {Pythonwin => pythonwin}/win32uioleClientItem.cpp (100%) rename {Pythonwin => pythonwin}/win32uioledoc.cpp (100%) rename {Pythonwin => pythonwin}/win32uioledoc.h (100%) rename {Pythonwin => pythonwin}/win32util.cpp (100%) rename {Pythonwin => pythonwin}/win32view.cpp (100%) rename {Pythonwin => pythonwin}/win32virt.cpp (100%) rename {Pythonwin => pythonwin}/win32win.cpp (100%) rename {Pythonwin => pythonwin}/win32win.h (100%) diff --git a/Pythonwin/License.txt b/pythonwin/License.txt similarity index 100% rename from Pythonwin/License.txt rename to pythonwin/License.txt diff --git a/Pythonwin/Scintilla/License.txt b/pythonwin/Scintilla/License.txt similarity index 100% rename from Pythonwin/Scintilla/License.txt rename to pythonwin/Scintilla/License.txt diff --git a/Pythonwin/Scintilla/README b/pythonwin/Scintilla/README similarity index 100% rename from Pythonwin/Scintilla/README rename to pythonwin/Scintilla/README diff --git a/Pythonwin/Scintilla/README_pythonwin.md b/pythonwin/Scintilla/README_pythonwin.md similarity index 100% rename from Pythonwin/Scintilla/README_pythonwin.md rename to pythonwin/Scintilla/README_pythonwin.md diff --git a/Pythonwin/Scintilla/include/ILexer.h b/pythonwin/Scintilla/include/ILexer.h similarity index 100% rename from Pythonwin/Scintilla/include/ILexer.h rename to pythonwin/Scintilla/include/ILexer.h diff --git a/Pythonwin/Scintilla/include/ILoader.h b/pythonwin/Scintilla/include/ILoader.h similarity index 100% rename from Pythonwin/Scintilla/include/ILoader.h rename to pythonwin/Scintilla/include/ILoader.h diff --git a/Pythonwin/Scintilla/include/Platform.h b/pythonwin/Scintilla/include/Platform.h similarity index 100% rename from Pythonwin/Scintilla/include/Platform.h rename to pythonwin/Scintilla/include/Platform.h diff --git a/Pythonwin/Scintilla/include/SciLexer.h b/pythonwin/Scintilla/include/SciLexer.h similarity index 100% rename from Pythonwin/Scintilla/include/SciLexer.h rename to pythonwin/Scintilla/include/SciLexer.h diff --git a/Pythonwin/Scintilla/include/Sci_Position.h b/pythonwin/Scintilla/include/Sci_Position.h similarity index 100% rename from Pythonwin/Scintilla/include/Sci_Position.h rename to pythonwin/Scintilla/include/Sci_Position.h diff --git a/Pythonwin/Scintilla/include/Scintilla.h b/pythonwin/Scintilla/include/Scintilla.h similarity index 100% rename from Pythonwin/Scintilla/include/Scintilla.h rename to pythonwin/Scintilla/include/Scintilla.h diff --git a/Pythonwin/Scintilla/include/Scintilla.iface b/pythonwin/Scintilla/include/Scintilla.iface similarity index 100% rename from Pythonwin/Scintilla/include/Scintilla.iface rename to pythonwin/Scintilla/include/Scintilla.iface diff --git a/Pythonwin/Scintilla/include/ScintillaWidget.h b/pythonwin/Scintilla/include/ScintillaWidget.h similarity index 100% rename from Pythonwin/Scintilla/include/ScintillaWidget.h rename to pythonwin/Scintilla/include/ScintillaWidget.h diff --git a/Pythonwin/Scintilla/lexers/LexA68k.cxx b/pythonwin/Scintilla/lexers/LexA68k.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexA68k.cxx rename to pythonwin/Scintilla/lexers/LexA68k.cxx diff --git a/Pythonwin/Scintilla/lexers/LexAPDL.cxx b/pythonwin/Scintilla/lexers/LexAPDL.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexAPDL.cxx rename to pythonwin/Scintilla/lexers/LexAPDL.cxx diff --git a/Pythonwin/Scintilla/lexers/LexASY.cxx b/pythonwin/Scintilla/lexers/LexASY.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexASY.cxx rename to pythonwin/Scintilla/lexers/LexASY.cxx diff --git a/Pythonwin/Scintilla/lexers/LexAU3.cxx b/pythonwin/Scintilla/lexers/LexAU3.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexAU3.cxx rename to pythonwin/Scintilla/lexers/LexAU3.cxx diff --git a/Pythonwin/Scintilla/lexers/LexAVE.cxx b/pythonwin/Scintilla/lexers/LexAVE.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexAVE.cxx rename to pythonwin/Scintilla/lexers/LexAVE.cxx diff --git a/Pythonwin/Scintilla/lexers/LexAVS.cxx b/pythonwin/Scintilla/lexers/LexAVS.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexAVS.cxx rename to pythonwin/Scintilla/lexers/LexAVS.cxx diff --git a/Pythonwin/Scintilla/lexers/LexAbaqus.cxx b/pythonwin/Scintilla/lexers/LexAbaqus.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexAbaqus.cxx rename to pythonwin/Scintilla/lexers/LexAbaqus.cxx diff --git a/Pythonwin/Scintilla/lexers/LexAda.cxx b/pythonwin/Scintilla/lexers/LexAda.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexAda.cxx rename to pythonwin/Scintilla/lexers/LexAda.cxx diff --git a/Pythonwin/Scintilla/lexers/LexAsm.cxx b/pythonwin/Scintilla/lexers/LexAsm.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexAsm.cxx rename to pythonwin/Scintilla/lexers/LexAsm.cxx diff --git a/Pythonwin/Scintilla/lexers/LexAsn1.cxx b/pythonwin/Scintilla/lexers/LexAsn1.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexAsn1.cxx rename to pythonwin/Scintilla/lexers/LexAsn1.cxx diff --git a/Pythonwin/Scintilla/lexers/LexBaan.cxx b/pythonwin/Scintilla/lexers/LexBaan.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexBaan.cxx rename to pythonwin/Scintilla/lexers/LexBaan.cxx diff --git a/Pythonwin/Scintilla/lexers/LexBash.cxx b/pythonwin/Scintilla/lexers/LexBash.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexBash.cxx rename to pythonwin/Scintilla/lexers/LexBash.cxx diff --git a/Pythonwin/Scintilla/lexers/LexBasic.cxx b/pythonwin/Scintilla/lexers/LexBasic.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexBasic.cxx rename to pythonwin/Scintilla/lexers/LexBasic.cxx diff --git a/Pythonwin/Scintilla/lexers/LexBatch.cxx b/pythonwin/Scintilla/lexers/LexBatch.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexBatch.cxx rename to pythonwin/Scintilla/lexers/LexBatch.cxx diff --git a/Pythonwin/Scintilla/lexers/LexBibTeX.cxx b/pythonwin/Scintilla/lexers/LexBibTeX.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexBibTeX.cxx rename to pythonwin/Scintilla/lexers/LexBibTeX.cxx diff --git a/Pythonwin/Scintilla/lexers/LexBullant.cxx b/pythonwin/Scintilla/lexers/LexBullant.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexBullant.cxx rename to pythonwin/Scintilla/lexers/LexBullant.cxx diff --git a/Pythonwin/Scintilla/lexers/LexCIL.cxx b/pythonwin/Scintilla/lexers/LexCIL.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexCIL.cxx rename to pythonwin/Scintilla/lexers/LexCIL.cxx diff --git a/Pythonwin/Scintilla/lexers/LexCLW.cxx b/pythonwin/Scintilla/lexers/LexCLW.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexCLW.cxx rename to pythonwin/Scintilla/lexers/LexCLW.cxx diff --git a/Pythonwin/Scintilla/lexers/LexCOBOL.cxx b/pythonwin/Scintilla/lexers/LexCOBOL.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexCOBOL.cxx rename to pythonwin/Scintilla/lexers/LexCOBOL.cxx diff --git a/Pythonwin/Scintilla/lexers/LexCPP.cxx b/pythonwin/Scintilla/lexers/LexCPP.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexCPP.cxx rename to pythonwin/Scintilla/lexers/LexCPP.cxx diff --git a/Pythonwin/Scintilla/lexers/LexCSS.cxx b/pythonwin/Scintilla/lexers/LexCSS.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexCSS.cxx rename to pythonwin/Scintilla/lexers/LexCSS.cxx diff --git a/Pythonwin/Scintilla/lexers/LexCaml.cxx b/pythonwin/Scintilla/lexers/LexCaml.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexCaml.cxx rename to pythonwin/Scintilla/lexers/LexCaml.cxx diff --git a/Pythonwin/Scintilla/lexers/LexCmake.cxx b/pythonwin/Scintilla/lexers/LexCmake.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexCmake.cxx rename to pythonwin/Scintilla/lexers/LexCmake.cxx diff --git a/Pythonwin/Scintilla/lexers/LexCoffeeScript.cxx b/pythonwin/Scintilla/lexers/LexCoffeeScript.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexCoffeeScript.cxx rename to pythonwin/Scintilla/lexers/LexCoffeeScript.cxx diff --git a/Pythonwin/Scintilla/lexers/LexConf.cxx b/pythonwin/Scintilla/lexers/LexConf.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexConf.cxx rename to pythonwin/Scintilla/lexers/LexConf.cxx diff --git a/Pythonwin/Scintilla/lexers/LexCrontab.cxx b/pythonwin/Scintilla/lexers/LexCrontab.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexCrontab.cxx rename to pythonwin/Scintilla/lexers/LexCrontab.cxx diff --git a/Pythonwin/Scintilla/lexers/LexCsound.cxx b/pythonwin/Scintilla/lexers/LexCsound.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexCsound.cxx rename to pythonwin/Scintilla/lexers/LexCsound.cxx diff --git a/Pythonwin/Scintilla/lexers/LexD.cxx b/pythonwin/Scintilla/lexers/LexD.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexD.cxx rename to pythonwin/Scintilla/lexers/LexD.cxx diff --git a/Pythonwin/Scintilla/lexers/LexDMAP.cxx b/pythonwin/Scintilla/lexers/LexDMAP.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexDMAP.cxx rename to pythonwin/Scintilla/lexers/LexDMAP.cxx diff --git a/Pythonwin/Scintilla/lexers/LexDMIS.cxx b/pythonwin/Scintilla/lexers/LexDMIS.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexDMIS.cxx rename to pythonwin/Scintilla/lexers/LexDMIS.cxx diff --git a/Pythonwin/Scintilla/lexers/LexDataflex.cxx b/pythonwin/Scintilla/lexers/LexDataflex.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexDataflex.cxx rename to pythonwin/Scintilla/lexers/LexDataflex.cxx diff --git a/Pythonwin/Scintilla/lexers/LexDiff.cxx b/pythonwin/Scintilla/lexers/LexDiff.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexDiff.cxx rename to pythonwin/Scintilla/lexers/LexDiff.cxx diff --git a/Pythonwin/Scintilla/lexers/LexECL.cxx b/pythonwin/Scintilla/lexers/LexECL.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexECL.cxx rename to pythonwin/Scintilla/lexers/LexECL.cxx diff --git a/Pythonwin/Scintilla/lexers/LexEDIFACT.cxx b/pythonwin/Scintilla/lexers/LexEDIFACT.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexEDIFACT.cxx rename to pythonwin/Scintilla/lexers/LexEDIFACT.cxx diff --git a/Pythonwin/Scintilla/lexers/LexEScript.cxx b/pythonwin/Scintilla/lexers/LexEScript.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexEScript.cxx rename to pythonwin/Scintilla/lexers/LexEScript.cxx diff --git a/Pythonwin/Scintilla/lexers/LexEiffel.cxx b/pythonwin/Scintilla/lexers/LexEiffel.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexEiffel.cxx rename to pythonwin/Scintilla/lexers/LexEiffel.cxx diff --git a/Pythonwin/Scintilla/lexers/LexErlang.cxx b/pythonwin/Scintilla/lexers/LexErlang.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexErlang.cxx rename to pythonwin/Scintilla/lexers/LexErlang.cxx diff --git a/Pythonwin/Scintilla/lexers/LexErrorList.cxx b/pythonwin/Scintilla/lexers/LexErrorList.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexErrorList.cxx rename to pythonwin/Scintilla/lexers/LexErrorList.cxx diff --git a/Pythonwin/Scintilla/lexers/LexFlagship.cxx b/pythonwin/Scintilla/lexers/LexFlagship.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexFlagship.cxx rename to pythonwin/Scintilla/lexers/LexFlagship.cxx diff --git a/Pythonwin/Scintilla/lexers/LexForth.cxx b/pythonwin/Scintilla/lexers/LexForth.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexForth.cxx rename to pythonwin/Scintilla/lexers/LexForth.cxx diff --git a/Pythonwin/Scintilla/lexers/LexFortran.cxx b/pythonwin/Scintilla/lexers/LexFortran.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexFortran.cxx rename to pythonwin/Scintilla/lexers/LexFortran.cxx diff --git a/Pythonwin/Scintilla/lexers/LexGAP.cxx b/pythonwin/Scintilla/lexers/LexGAP.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexGAP.cxx rename to pythonwin/Scintilla/lexers/LexGAP.cxx diff --git a/Pythonwin/Scintilla/lexers/LexGui4Cli.cxx b/pythonwin/Scintilla/lexers/LexGui4Cli.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexGui4Cli.cxx rename to pythonwin/Scintilla/lexers/LexGui4Cli.cxx diff --git a/Pythonwin/Scintilla/lexers/LexHTML.cxx b/pythonwin/Scintilla/lexers/LexHTML.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexHTML.cxx rename to pythonwin/Scintilla/lexers/LexHTML.cxx diff --git a/Pythonwin/Scintilla/lexers/LexHaskell.cxx b/pythonwin/Scintilla/lexers/LexHaskell.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexHaskell.cxx rename to pythonwin/Scintilla/lexers/LexHaskell.cxx diff --git a/Pythonwin/Scintilla/lexers/LexHex.cxx b/pythonwin/Scintilla/lexers/LexHex.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexHex.cxx rename to pythonwin/Scintilla/lexers/LexHex.cxx diff --git a/Pythonwin/Scintilla/lexers/LexHollywood.cxx b/pythonwin/Scintilla/lexers/LexHollywood.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexHollywood.cxx rename to pythonwin/Scintilla/lexers/LexHollywood.cxx diff --git a/Pythonwin/Scintilla/lexers/LexIndent.cxx b/pythonwin/Scintilla/lexers/LexIndent.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexIndent.cxx rename to pythonwin/Scintilla/lexers/LexIndent.cxx diff --git a/Pythonwin/Scintilla/lexers/LexInno.cxx b/pythonwin/Scintilla/lexers/LexInno.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexInno.cxx rename to pythonwin/Scintilla/lexers/LexInno.cxx diff --git a/Pythonwin/Scintilla/lexers/LexJSON.cxx b/pythonwin/Scintilla/lexers/LexJSON.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexJSON.cxx rename to pythonwin/Scintilla/lexers/LexJSON.cxx diff --git a/Pythonwin/Scintilla/lexers/LexKVIrc.cxx b/pythonwin/Scintilla/lexers/LexKVIrc.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexKVIrc.cxx rename to pythonwin/Scintilla/lexers/LexKVIrc.cxx diff --git a/Pythonwin/Scintilla/lexers/LexKix.cxx b/pythonwin/Scintilla/lexers/LexKix.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexKix.cxx rename to pythonwin/Scintilla/lexers/LexKix.cxx diff --git a/Pythonwin/Scintilla/lexers/LexLaTeX.cxx b/pythonwin/Scintilla/lexers/LexLaTeX.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexLaTeX.cxx rename to pythonwin/Scintilla/lexers/LexLaTeX.cxx diff --git a/Pythonwin/Scintilla/lexers/LexLisp.cxx b/pythonwin/Scintilla/lexers/LexLisp.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexLisp.cxx rename to pythonwin/Scintilla/lexers/LexLisp.cxx diff --git a/Pythonwin/Scintilla/lexers/LexLout.cxx b/pythonwin/Scintilla/lexers/LexLout.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexLout.cxx rename to pythonwin/Scintilla/lexers/LexLout.cxx diff --git a/Pythonwin/Scintilla/lexers/LexLua.cxx b/pythonwin/Scintilla/lexers/LexLua.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexLua.cxx rename to pythonwin/Scintilla/lexers/LexLua.cxx diff --git a/Pythonwin/Scintilla/lexers/LexMMIXAL.cxx b/pythonwin/Scintilla/lexers/LexMMIXAL.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexMMIXAL.cxx rename to pythonwin/Scintilla/lexers/LexMMIXAL.cxx diff --git a/Pythonwin/Scintilla/lexers/LexMPT.cxx b/pythonwin/Scintilla/lexers/LexMPT.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexMPT.cxx rename to pythonwin/Scintilla/lexers/LexMPT.cxx diff --git a/Pythonwin/Scintilla/lexers/LexMSSQL.cxx b/pythonwin/Scintilla/lexers/LexMSSQL.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexMSSQL.cxx rename to pythonwin/Scintilla/lexers/LexMSSQL.cxx diff --git a/Pythonwin/Scintilla/lexers/LexMagik.cxx b/pythonwin/Scintilla/lexers/LexMagik.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexMagik.cxx rename to pythonwin/Scintilla/lexers/LexMagik.cxx diff --git a/Pythonwin/Scintilla/lexers/LexMake.cxx b/pythonwin/Scintilla/lexers/LexMake.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexMake.cxx rename to pythonwin/Scintilla/lexers/LexMake.cxx diff --git a/Pythonwin/Scintilla/lexers/LexMarkdown.cxx b/pythonwin/Scintilla/lexers/LexMarkdown.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexMarkdown.cxx rename to pythonwin/Scintilla/lexers/LexMarkdown.cxx diff --git a/Pythonwin/Scintilla/lexers/LexMatlab.cxx b/pythonwin/Scintilla/lexers/LexMatlab.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexMatlab.cxx rename to pythonwin/Scintilla/lexers/LexMatlab.cxx diff --git a/Pythonwin/Scintilla/lexers/LexMaxima.cxx b/pythonwin/Scintilla/lexers/LexMaxima.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexMaxima.cxx rename to pythonwin/Scintilla/lexers/LexMaxima.cxx diff --git a/Pythonwin/Scintilla/lexers/LexMetapost.cxx b/pythonwin/Scintilla/lexers/LexMetapost.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexMetapost.cxx rename to pythonwin/Scintilla/lexers/LexMetapost.cxx diff --git a/Pythonwin/Scintilla/lexers/LexModula.cxx b/pythonwin/Scintilla/lexers/LexModula.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexModula.cxx rename to pythonwin/Scintilla/lexers/LexModula.cxx diff --git a/Pythonwin/Scintilla/lexers/LexMySQL.cxx b/pythonwin/Scintilla/lexers/LexMySQL.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexMySQL.cxx rename to pythonwin/Scintilla/lexers/LexMySQL.cxx diff --git a/Pythonwin/Scintilla/lexers/LexNim.cxx b/pythonwin/Scintilla/lexers/LexNim.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexNim.cxx rename to pythonwin/Scintilla/lexers/LexNim.cxx diff --git a/Pythonwin/Scintilla/lexers/LexNimrod.cxx b/pythonwin/Scintilla/lexers/LexNimrod.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexNimrod.cxx rename to pythonwin/Scintilla/lexers/LexNimrod.cxx diff --git a/Pythonwin/Scintilla/lexers/LexNsis.cxx b/pythonwin/Scintilla/lexers/LexNsis.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexNsis.cxx rename to pythonwin/Scintilla/lexers/LexNsis.cxx diff --git a/Pythonwin/Scintilla/lexers/LexNull.cxx b/pythonwin/Scintilla/lexers/LexNull.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexNull.cxx rename to pythonwin/Scintilla/lexers/LexNull.cxx diff --git a/Pythonwin/Scintilla/lexers/LexOScript.cxx b/pythonwin/Scintilla/lexers/LexOScript.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexOScript.cxx rename to pythonwin/Scintilla/lexers/LexOScript.cxx diff --git a/Pythonwin/Scintilla/lexers/LexOpal.cxx b/pythonwin/Scintilla/lexers/LexOpal.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexOpal.cxx rename to pythonwin/Scintilla/lexers/LexOpal.cxx diff --git a/Pythonwin/Scintilla/lexers/LexPB.cxx b/pythonwin/Scintilla/lexers/LexPB.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexPB.cxx rename to pythonwin/Scintilla/lexers/LexPB.cxx diff --git a/Pythonwin/Scintilla/lexers/LexPLM.cxx b/pythonwin/Scintilla/lexers/LexPLM.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexPLM.cxx rename to pythonwin/Scintilla/lexers/LexPLM.cxx diff --git a/Pythonwin/Scintilla/lexers/LexPO.cxx b/pythonwin/Scintilla/lexers/LexPO.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexPO.cxx rename to pythonwin/Scintilla/lexers/LexPO.cxx diff --git a/Pythonwin/Scintilla/lexers/LexPOV.cxx b/pythonwin/Scintilla/lexers/LexPOV.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexPOV.cxx rename to pythonwin/Scintilla/lexers/LexPOV.cxx diff --git a/Pythonwin/Scintilla/lexers/LexPS.cxx b/pythonwin/Scintilla/lexers/LexPS.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexPS.cxx rename to pythonwin/Scintilla/lexers/LexPS.cxx diff --git a/Pythonwin/Scintilla/lexers/LexPascal.cxx b/pythonwin/Scintilla/lexers/LexPascal.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexPascal.cxx rename to pythonwin/Scintilla/lexers/LexPascal.cxx diff --git a/Pythonwin/Scintilla/lexers/LexPerl.cxx b/pythonwin/Scintilla/lexers/LexPerl.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexPerl.cxx rename to pythonwin/Scintilla/lexers/LexPerl.cxx diff --git a/Pythonwin/Scintilla/lexers/LexPowerPro.cxx b/pythonwin/Scintilla/lexers/LexPowerPro.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexPowerPro.cxx rename to pythonwin/Scintilla/lexers/LexPowerPro.cxx diff --git a/Pythonwin/Scintilla/lexers/LexPowerShell.cxx b/pythonwin/Scintilla/lexers/LexPowerShell.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexPowerShell.cxx rename to pythonwin/Scintilla/lexers/LexPowerShell.cxx diff --git a/Pythonwin/Scintilla/lexers/LexProgress.cxx b/pythonwin/Scintilla/lexers/LexProgress.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexProgress.cxx rename to pythonwin/Scintilla/lexers/LexProgress.cxx diff --git a/Pythonwin/Scintilla/lexers/LexProps.cxx b/pythonwin/Scintilla/lexers/LexProps.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexProps.cxx rename to pythonwin/Scintilla/lexers/LexProps.cxx diff --git a/Pythonwin/Scintilla/lexers/LexPython.cxx b/pythonwin/Scintilla/lexers/LexPython.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexPython.cxx rename to pythonwin/Scintilla/lexers/LexPython.cxx diff --git a/Pythonwin/Scintilla/lexers/LexR.cxx b/pythonwin/Scintilla/lexers/LexR.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexR.cxx rename to pythonwin/Scintilla/lexers/LexR.cxx diff --git a/Pythonwin/Scintilla/lexers/LexRaku.cxx b/pythonwin/Scintilla/lexers/LexRaku.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexRaku.cxx rename to pythonwin/Scintilla/lexers/LexRaku.cxx diff --git a/Pythonwin/Scintilla/lexers/LexRebol.cxx b/pythonwin/Scintilla/lexers/LexRebol.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexRebol.cxx rename to pythonwin/Scintilla/lexers/LexRebol.cxx diff --git a/Pythonwin/Scintilla/lexers/LexRegistry.cxx b/pythonwin/Scintilla/lexers/LexRegistry.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexRegistry.cxx rename to pythonwin/Scintilla/lexers/LexRegistry.cxx diff --git a/Pythonwin/Scintilla/lexers/LexRuby.cxx b/pythonwin/Scintilla/lexers/LexRuby.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexRuby.cxx rename to pythonwin/Scintilla/lexers/LexRuby.cxx diff --git a/Pythonwin/Scintilla/lexers/LexRust.cxx b/pythonwin/Scintilla/lexers/LexRust.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexRust.cxx rename to pythonwin/Scintilla/lexers/LexRust.cxx diff --git a/Pythonwin/Scintilla/lexers/LexSAS.cxx b/pythonwin/Scintilla/lexers/LexSAS.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexSAS.cxx rename to pythonwin/Scintilla/lexers/LexSAS.cxx diff --git a/Pythonwin/Scintilla/lexers/LexSML.cxx b/pythonwin/Scintilla/lexers/LexSML.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexSML.cxx rename to pythonwin/Scintilla/lexers/LexSML.cxx diff --git a/Pythonwin/Scintilla/lexers/LexSQL.cxx b/pythonwin/Scintilla/lexers/LexSQL.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexSQL.cxx rename to pythonwin/Scintilla/lexers/LexSQL.cxx diff --git a/Pythonwin/Scintilla/lexers/LexSTTXT.cxx b/pythonwin/Scintilla/lexers/LexSTTXT.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexSTTXT.cxx rename to pythonwin/Scintilla/lexers/LexSTTXT.cxx diff --git a/Pythonwin/Scintilla/lexers/LexScriptol.cxx b/pythonwin/Scintilla/lexers/LexScriptol.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexScriptol.cxx rename to pythonwin/Scintilla/lexers/LexScriptol.cxx diff --git a/Pythonwin/Scintilla/lexers/LexSmalltalk.cxx b/pythonwin/Scintilla/lexers/LexSmalltalk.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexSmalltalk.cxx rename to pythonwin/Scintilla/lexers/LexSmalltalk.cxx diff --git a/Pythonwin/Scintilla/lexers/LexSorcus.cxx b/pythonwin/Scintilla/lexers/LexSorcus.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexSorcus.cxx rename to pythonwin/Scintilla/lexers/LexSorcus.cxx diff --git a/Pythonwin/Scintilla/lexers/LexSpecman.cxx b/pythonwin/Scintilla/lexers/LexSpecman.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexSpecman.cxx rename to pythonwin/Scintilla/lexers/LexSpecman.cxx diff --git a/Pythonwin/Scintilla/lexers/LexSpice.cxx b/pythonwin/Scintilla/lexers/LexSpice.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexSpice.cxx rename to pythonwin/Scintilla/lexers/LexSpice.cxx diff --git a/Pythonwin/Scintilla/lexers/LexStata.cxx b/pythonwin/Scintilla/lexers/LexStata.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexStata.cxx rename to pythonwin/Scintilla/lexers/LexStata.cxx diff --git a/Pythonwin/Scintilla/lexers/LexTACL.cxx b/pythonwin/Scintilla/lexers/LexTACL.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexTACL.cxx rename to pythonwin/Scintilla/lexers/LexTACL.cxx diff --git a/Pythonwin/Scintilla/lexers/LexTADS3.cxx b/pythonwin/Scintilla/lexers/LexTADS3.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexTADS3.cxx rename to pythonwin/Scintilla/lexers/LexTADS3.cxx diff --git a/Pythonwin/Scintilla/lexers/LexTAL.cxx b/pythonwin/Scintilla/lexers/LexTAL.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexTAL.cxx rename to pythonwin/Scintilla/lexers/LexTAL.cxx diff --git a/Pythonwin/Scintilla/lexers/LexTCL.cxx b/pythonwin/Scintilla/lexers/LexTCL.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexTCL.cxx rename to pythonwin/Scintilla/lexers/LexTCL.cxx diff --git a/Pythonwin/Scintilla/lexers/LexTCMD.cxx b/pythonwin/Scintilla/lexers/LexTCMD.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexTCMD.cxx rename to pythonwin/Scintilla/lexers/LexTCMD.cxx diff --git a/Pythonwin/Scintilla/lexers/LexTeX.cxx b/pythonwin/Scintilla/lexers/LexTeX.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexTeX.cxx rename to pythonwin/Scintilla/lexers/LexTeX.cxx diff --git a/Pythonwin/Scintilla/lexers/LexTxt2tags.cxx b/pythonwin/Scintilla/lexers/LexTxt2tags.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexTxt2tags.cxx rename to pythonwin/Scintilla/lexers/LexTxt2tags.cxx diff --git a/Pythonwin/Scintilla/lexers/LexVB.cxx b/pythonwin/Scintilla/lexers/LexVB.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexVB.cxx rename to pythonwin/Scintilla/lexers/LexVB.cxx diff --git a/Pythonwin/Scintilla/lexers/LexVHDL.cxx b/pythonwin/Scintilla/lexers/LexVHDL.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexVHDL.cxx rename to pythonwin/Scintilla/lexers/LexVHDL.cxx diff --git a/Pythonwin/Scintilla/lexers/LexVerilog.cxx b/pythonwin/Scintilla/lexers/LexVerilog.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexVerilog.cxx rename to pythonwin/Scintilla/lexers/LexVerilog.cxx diff --git a/Pythonwin/Scintilla/lexers/LexVisualProlog.cxx b/pythonwin/Scintilla/lexers/LexVisualProlog.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexVisualProlog.cxx rename to pythonwin/Scintilla/lexers/LexVisualProlog.cxx diff --git a/Pythonwin/Scintilla/lexers/LexX12.cxx b/pythonwin/Scintilla/lexers/LexX12.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexX12.cxx rename to pythonwin/Scintilla/lexers/LexX12.cxx diff --git a/Pythonwin/Scintilla/lexers/LexYAML.cxx b/pythonwin/Scintilla/lexers/LexYAML.cxx similarity index 100% rename from Pythonwin/Scintilla/lexers/LexYAML.cxx rename to pythonwin/Scintilla/lexers/LexYAML.cxx diff --git a/Pythonwin/Scintilla/lexlib/Accessor.cxx b/pythonwin/Scintilla/lexlib/Accessor.cxx similarity index 100% rename from Pythonwin/Scintilla/lexlib/Accessor.cxx rename to pythonwin/Scintilla/lexlib/Accessor.cxx diff --git a/Pythonwin/Scintilla/lexlib/Accessor.h b/pythonwin/Scintilla/lexlib/Accessor.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/Accessor.h rename to pythonwin/Scintilla/lexlib/Accessor.h diff --git a/Pythonwin/Scintilla/lexlib/CatalogueModules.h b/pythonwin/Scintilla/lexlib/CatalogueModules.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/CatalogueModules.h rename to pythonwin/Scintilla/lexlib/CatalogueModules.h diff --git a/Pythonwin/Scintilla/lexlib/CharacterCategory.cxx b/pythonwin/Scintilla/lexlib/CharacterCategory.cxx similarity index 100% rename from Pythonwin/Scintilla/lexlib/CharacterCategory.cxx rename to pythonwin/Scintilla/lexlib/CharacterCategory.cxx diff --git a/Pythonwin/Scintilla/lexlib/CharacterCategory.h b/pythonwin/Scintilla/lexlib/CharacterCategory.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/CharacterCategory.h rename to pythonwin/Scintilla/lexlib/CharacterCategory.h diff --git a/Pythonwin/Scintilla/lexlib/CharacterSet.cxx b/pythonwin/Scintilla/lexlib/CharacterSet.cxx similarity index 100% rename from Pythonwin/Scintilla/lexlib/CharacterSet.cxx rename to pythonwin/Scintilla/lexlib/CharacterSet.cxx diff --git a/Pythonwin/Scintilla/lexlib/CharacterSet.h b/pythonwin/Scintilla/lexlib/CharacterSet.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/CharacterSet.h rename to pythonwin/Scintilla/lexlib/CharacterSet.h diff --git a/Pythonwin/Scintilla/lexlib/DefaultLexer.cxx b/pythonwin/Scintilla/lexlib/DefaultLexer.cxx similarity index 100% rename from Pythonwin/Scintilla/lexlib/DefaultLexer.cxx rename to pythonwin/Scintilla/lexlib/DefaultLexer.cxx diff --git a/Pythonwin/Scintilla/lexlib/DefaultLexer.h b/pythonwin/Scintilla/lexlib/DefaultLexer.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/DefaultLexer.h rename to pythonwin/Scintilla/lexlib/DefaultLexer.h diff --git a/Pythonwin/Scintilla/lexlib/LexAccessor.h b/pythonwin/Scintilla/lexlib/LexAccessor.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/LexAccessor.h rename to pythonwin/Scintilla/lexlib/LexAccessor.h diff --git a/Pythonwin/Scintilla/lexlib/LexerBase.cxx b/pythonwin/Scintilla/lexlib/LexerBase.cxx similarity index 100% rename from Pythonwin/Scintilla/lexlib/LexerBase.cxx rename to pythonwin/Scintilla/lexlib/LexerBase.cxx diff --git a/Pythonwin/Scintilla/lexlib/LexerBase.h b/pythonwin/Scintilla/lexlib/LexerBase.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/LexerBase.h rename to pythonwin/Scintilla/lexlib/LexerBase.h diff --git a/Pythonwin/Scintilla/lexlib/LexerModule.cxx b/pythonwin/Scintilla/lexlib/LexerModule.cxx similarity index 100% rename from Pythonwin/Scintilla/lexlib/LexerModule.cxx rename to pythonwin/Scintilla/lexlib/LexerModule.cxx diff --git a/Pythonwin/Scintilla/lexlib/LexerModule.h b/pythonwin/Scintilla/lexlib/LexerModule.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/LexerModule.h rename to pythonwin/Scintilla/lexlib/LexerModule.h diff --git a/Pythonwin/Scintilla/lexlib/LexerNoExceptions.cxx b/pythonwin/Scintilla/lexlib/LexerNoExceptions.cxx similarity index 100% rename from Pythonwin/Scintilla/lexlib/LexerNoExceptions.cxx rename to pythonwin/Scintilla/lexlib/LexerNoExceptions.cxx diff --git a/Pythonwin/Scintilla/lexlib/LexerNoExceptions.h b/pythonwin/Scintilla/lexlib/LexerNoExceptions.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/LexerNoExceptions.h rename to pythonwin/Scintilla/lexlib/LexerNoExceptions.h diff --git a/Pythonwin/Scintilla/lexlib/LexerSimple.cxx b/pythonwin/Scintilla/lexlib/LexerSimple.cxx similarity index 100% rename from Pythonwin/Scintilla/lexlib/LexerSimple.cxx rename to pythonwin/Scintilla/lexlib/LexerSimple.cxx diff --git a/Pythonwin/Scintilla/lexlib/LexerSimple.h b/pythonwin/Scintilla/lexlib/LexerSimple.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/LexerSimple.h rename to pythonwin/Scintilla/lexlib/LexerSimple.h diff --git a/Pythonwin/Scintilla/lexlib/OptionSet.h b/pythonwin/Scintilla/lexlib/OptionSet.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/OptionSet.h rename to pythonwin/Scintilla/lexlib/OptionSet.h diff --git a/Pythonwin/Scintilla/lexlib/PropSetSimple.cxx b/pythonwin/Scintilla/lexlib/PropSetSimple.cxx similarity index 100% rename from Pythonwin/Scintilla/lexlib/PropSetSimple.cxx rename to pythonwin/Scintilla/lexlib/PropSetSimple.cxx diff --git a/Pythonwin/Scintilla/lexlib/PropSetSimple.h b/pythonwin/Scintilla/lexlib/PropSetSimple.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/PropSetSimple.h rename to pythonwin/Scintilla/lexlib/PropSetSimple.h diff --git a/Pythonwin/Scintilla/lexlib/SparseState.h b/pythonwin/Scintilla/lexlib/SparseState.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/SparseState.h rename to pythonwin/Scintilla/lexlib/SparseState.h diff --git a/Pythonwin/Scintilla/lexlib/StringCopy.h b/pythonwin/Scintilla/lexlib/StringCopy.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/StringCopy.h rename to pythonwin/Scintilla/lexlib/StringCopy.h diff --git a/Pythonwin/Scintilla/lexlib/StyleContext.cxx b/pythonwin/Scintilla/lexlib/StyleContext.cxx similarity index 100% rename from Pythonwin/Scintilla/lexlib/StyleContext.cxx rename to pythonwin/Scintilla/lexlib/StyleContext.cxx diff --git a/Pythonwin/Scintilla/lexlib/StyleContext.h b/pythonwin/Scintilla/lexlib/StyleContext.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/StyleContext.h rename to pythonwin/Scintilla/lexlib/StyleContext.h diff --git a/Pythonwin/Scintilla/lexlib/SubStyles.h b/pythonwin/Scintilla/lexlib/SubStyles.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/SubStyles.h rename to pythonwin/Scintilla/lexlib/SubStyles.h diff --git a/Pythonwin/Scintilla/lexlib/WordList.cxx b/pythonwin/Scintilla/lexlib/WordList.cxx similarity index 100% rename from Pythonwin/Scintilla/lexlib/WordList.cxx rename to pythonwin/Scintilla/lexlib/WordList.cxx diff --git a/Pythonwin/Scintilla/lexlib/WordList.h b/pythonwin/Scintilla/lexlib/WordList.h similarity index 100% rename from Pythonwin/Scintilla/lexlib/WordList.h rename to pythonwin/Scintilla/lexlib/WordList.h diff --git a/Pythonwin/Scintilla/makefile_pythonwin b/pythonwin/Scintilla/makefile_pythonwin similarity index 100% rename from Pythonwin/Scintilla/makefile_pythonwin rename to pythonwin/Scintilla/makefile_pythonwin diff --git a/Pythonwin/Scintilla/src/AutoComplete.cxx b/pythonwin/Scintilla/src/AutoComplete.cxx similarity index 100% rename from Pythonwin/Scintilla/src/AutoComplete.cxx rename to pythonwin/Scintilla/src/AutoComplete.cxx diff --git a/Pythonwin/Scintilla/src/AutoComplete.h b/pythonwin/Scintilla/src/AutoComplete.h similarity index 100% rename from Pythonwin/Scintilla/src/AutoComplete.h rename to pythonwin/Scintilla/src/AutoComplete.h diff --git a/Pythonwin/Scintilla/src/CallTip.cxx b/pythonwin/Scintilla/src/CallTip.cxx similarity index 100% rename from Pythonwin/Scintilla/src/CallTip.cxx rename to pythonwin/Scintilla/src/CallTip.cxx diff --git a/Pythonwin/Scintilla/src/CallTip.h b/pythonwin/Scintilla/src/CallTip.h similarity index 100% rename from Pythonwin/Scintilla/src/CallTip.h rename to pythonwin/Scintilla/src/CallTip.h diff --git a/Pythonwin/Scintilla/src/CaseConvert.cxx b/pythonwin/Scintilla/src/CaseConvert.cxx similarity index 100% rename from Pythonwin/Scintilla/src/CaseConvert.cxx rename to pythonwin/Scintilla/src/CaseConvert.cxx diff --git a/Pythonwin/Scintilla/src/CaseConvert.h b/pythonwin/Scintilla/src/CaseConvert.h similarity index 100% rename from Pythonwin/Scintilla/src/CaseConvert.h rename to pythonwin/Scintilla/src/CaseConvert.h diff --git a/Pythonwin/Scintilla/src/CaseFolder.cxx b/pythonwin/Scintilla/src/CaseFolder.cxx similarity index 100% rename from Pythonwin/Scintilla/src/CaseFolder.cxx rename to pythonwin/Scintilla/src/CaseFolder.cxx diff --git a/Pythonwin/Scintilla/src/CaseFolder.h b/pythonwin/Scintilla/src/CaseFolder.h similarity index 100% rename from Pythonwin/Scintilla/src/CaseFolder.h rename to pythonwin/Scintilla/src/CaseFolder.h diff --git a/Pythonwin/Scintilla/src/Catalogue.cxx b/pythonwin/Scintilla/src/Catalogue.cxx similarity index 100% rename from Pythonwin/Scintilla/src/Catalogue.cxx rename to pythonwin/Scintilla/src/Catalogue.cxx diff --git a/Pythonwin/Scintilla/src/Catalogue.h b/pythonwin/Scintilla/src/Catalogue.h similarity index 100% rename from Pythonwin/Scintilla/src/Catalogue.h rename to pythonwin/Scintilla/src/Catalogue.h diff --git a/Pythonwin/Scintilla/src/CellBuffer.cxx b/pythonwin/Scintilla/src/CellBuffer.cxx similarity index 100% rename from Pythonwin/Scintilla/src/CellBuffer.cxx rename to pythonwin/Scintilla/src/CellBuffer.cxx diff --git a/Pythonwin/Scintilla/src/CellBuffer.h b/pythonwin/Scintilla/src/CellBuffer.h similarity index 100% rename from Pythonwin/Scintilla/src/CellBuffer.h rename to pythonwin/Scintilla/src/CellBuffer.h diff --git a/Pythonwin/Scintilla/src/CharClassify.cxx b/pythonwin/Scintilla/src/CharClassify.cxx similarity index 100% rename from Pythonwin/Scintilla/src/CharClassify.cxx rename to pythonwin/Scintilla/src/CharClassify.cxx diff --git a/Pythonwin/Scintilla/src/CharClassify.h b/pythonwin/Scintilla/src/CharClassify.h similarity index 100% rename from Pythonwin/Scintilla/src/CharClassify.h rename to pythonwin/Scintilla/src/CharClassify.h diff --git a/Pythonwin/Scintilla/src/ContractionState.cxx b/pythonwin/Scintilla/src/ContractionState.cxx similarity index 100% rename from Pythonwin/Scintilla/src/ContractionState.cxx rename to pythonwin/Scintilla/src/ContractionState.cxx diff --git a/Pythonwin/Scintilla/src/ContractionState.h b/pythonwin/Scintilla/src/ContractionState.h similarity index 100% rename from Pythonwin/Scintilla/src/ContractionState.h rename to pythonwin/Scintilla/src/ContractionState.h diff --git a/Pythonwin/Scintilla/src/DBCS.cxx b/pythonwin/Scintilla/src/DBCS.cxx similarity index 100% rename from Pythonwin/Scintilla/src/DBCS.cxx rename to pythonwin/Scintilla/src/DBCS.cxx diff --git a/Pythonwin/Scintilla/src/DBCS.h b/pythonwin/Scintilla/src/DBCS.h similarity index 100% rename from Pythonwin/Scintilla/src/DBCS.h rename to pythonwin/Scintilla/src/DBCS.h diff --git a/Pythonwin/Scintilla/src/Decoration.cxx b/pythonwin/Scintilla/src/Decoration.cxx similarity index 100% rename from Pythonwin/Scintilla/src/Decoration.cxx rename to pythonwin/Scintilla/src/Decoration.cxx diff --git a/Pythonwin/Scintilla/src/Decoration.h b/pythonwin/Scintilla/src/Decoration.h similarity index 100% rename from Pythonwin/Scintilla/src/Decoration.h rename to pythonwin/Scintilla/src/Decoration.h diff --git a/Pythonwin/Scintilla/src/Document.cxx b/pythonwin/Scintilla/src/Document.cxx similarity index 100% rename from Pythonwin/Scintilla/src/Document.cxx rename to pythonwin/Scintilla/src/Document.cxx diff --git a/Pythonwin/Scintilla/src/Document.h b/pythonwin/Scintilla/src/Document.h similarity index 100% rename from Pythonwin/Scintilla/src/Document.h rename to pythonwin/Scintilla/src/Document.h diff --git a/Pythonwin/Scintilla/src/EditModel.cxx b/pythonwin/Scintilla/src/EditModel.cxx similarity index 100% rename from Pythonwin/Scintilla/src/EditModel.cxx rename to pythonwin/Scintilla/src/EditModel.cxx diff --git a/Pythonwin/Scintilla/src/EditModel.h b/pythonwin/Scintilla/src/EditModel.h similarity index 100% rename from Pythonwin/Scintilla/src/EditModel.h rename to pythonwin/Scintilla/src/EditModel.h diff --git a/Pythonwin/Scintilla/src/EditView.cxx b/pythonwin/Scintilla/src/EditView.cxx similarity index 100% rename from Pythonwin/Scintilla/src/EditView.cxx rename to pythonwin/Scintilla/src/EditView.cxx diff --git a/Pythonwin/Scintilla/src/EditView.h b/pythonwin/Scintilla/src/EditView.h similarity index 100% rename from Pythonwin/Scintilla/src/EditView.h rename to pythonwin/Scintilla/src/EditView.h diff --git a/Pythonwin/Scintilla/src/Editor.cxx b/pythonwin/Scintilla/src/Editor.cxx similarity index 100% rename from Pythonwin/Scintilla/src/Editor.cxx rename to pythonwin/Scintilla/src/Editor.cxx diff --git a/Pythonwin/Scintilla/src/Editor.h b/pythonwin/Scintilla/src/Editor.h similarity index 100% rename from Pythonwin/Scintilla/src/Editor.h rename to pythonwin/Scintilla/src/Editor.h diff --git a/Pythonwin/Scintilla/src/ElapsedPeriod.h b/pythonwin/Scintilla/src/ElapsedPeriod.h similarity index 100% rename from Pythonwin/Scintilla/src/ElapsedPeriod.h rename to pythonwin/Scintilla/src/ElapsedPeriod.h diff --git a/Pythonwin/Scintilla/src/ExternalLexer.cxx b/pythonwin/Scintilla/src/ExternalLexer.cxx similarity index 100% rename from Pythonwin/Scintilla/src/ExternalLexer.cxx rename to pythonwin/Scintilla/src/ExternalLexer.cxx diff --git a/Pythonwin/Scintilla/src/ExternalLexer.h b/pythonwin/Scintilla/src/ExternalLexer.h similarity index 100% rename from Pythonwin/Scintilla/src/ExternalLexer.h rename to pythonwin/Scintilla/src/ExternalLexer.h diff --git a/Pythonwin/Scintilla/src/FontQuality.h b/pythonwin/Scintilla/src/FontQuality.h similarity index 100% rename from Pythonwin/Scintilla/src/FontQuality.h rename to pythonwin/Scintilla/src/FontQuality.h diff --git a/Pythonwin/Scintilla/src/Indicator.cxx b/pythonwin/Scintilla/src/Indicator.cxx similarity index 100% rename from Pythonwin/Scintilla/src/Indicator.cxx rename to pythonwin/Scintilla/src/Indicator.cxx diff --git a/Pythonwin/Scintilla/src/Indicator.h b/pythonwin/Scintilla/src/Indicator.h similarity index 100% rename from Pythonwin/Scintilla/src/Indicator.h rename to pythonwin/Scintilla/src/Indicator.h diff --git a/Pythonwin/Scintilla/src/IntegerRectangle.h b/pythonwin/Scintilla/src/IntegerRectangle.h similarity index 100% rename from Pythonwin/Scintilla/src/IntegerRectangle.h rename to pythonwin/Scintilla/src/IntegerRectangle.h diff --git a/Pythonwin/Scintilla/src/KeyMap.cxx b/pythonwin/Scintilla/src/KeyMap.cxx similarity index 100% rename from Pythonwin/Scintilla/src/KeyMap.cxx rename to pythonwin/Scintilla/src/KeyMap.cxx diff --git a/Pythonwin/Scintilla/src/KeyMap.h b/pythonwin/Scintilla/src/KeyMap.h similarity index 100% rename from Pythonwin/Scintilla/src/KeyMap.h rename to pythonwin/Scintilla/src/KeyMap.h diff --git a/Pythonwin/Scintilla/src/LineMarker.cxx b/pythonwin/Scintilla/src/LineMarker.cxx similarity index 100% rename from Pythonwin/Scintilla/src/LineMarker.cxx rename to pythonwin/Scintilla/src/LineMarker.cxx diff --git a/Pythonwin/Scintilla/src/LineMarker.h b/pythonwin/Scintilla/src/LineMarker.h similarity index 100% rename from Pythonwin/Scintilla/src/LineMarker.h rename to pythonwin/Scintilla/src/LineMarker.h diff --git a/Pythonwin/Scintilla/src/MarginView.cxx b/pythonwin/Scintilla/src/MarginView.cxx similarity index 100% rename from Pythonwin/Scintilla/src/MarginView.cxx rename to pythonwin/Scintilla/src/MarginView.cxx diff --git a/Pythonwin/Scintilla/src/MarginView.h b/pythonwin/Scintilla/src/MarginView.h similarity index 100% rename from Pythonwin/Scintilla/src/MarginView.h rename to pythonwin/Scintilla/src/MarginView.h diff --git a/Pythonwin/Scintilla/src/Partitioning.h b/pythonwin/Scintilla/src/Partitioning.h similarity index 100% rename from Pythonwin/Scintilla/src/Partitioning.h rename to pythonwin/Scintilla/src/Partitioning.h diff --git a/Pythonwin/Scintilla/src/PerLine.cxx b/pythonwin/Scintilla/src/PerLine.cxx similarity index 100% rename from Pythonwin/Scintilla/src/PerLine.cxx rename to pythonwin/Scintilla/src/PerLine.cxx diff --git a/Pythonwin/Scintilla/src/PerLine.h b/pythonwin/Scintilla/src/PerLine.h similarity index 100% rename from Pythonwin/Scintilla/src/PerLine.h rename to pythonwin/Scintilla/src/PerLine.h diff --git a/Pythonwin/Scintilla/src/Position.h b/pythonwin/Scintilla/src/Position.h similarity index 100% rename from Pythonwin/Scintilla/src/Position.h rename to pythonwin/Scintilla/src/Position.h diff --git a/Pythonwin/Scintilla/src/PositionCache.cxx b/pythonwin/Scintilla/src/PositionCache.cxx similarity index 100% rename from Pythonwin/Scintilla/src/PositionCache.cxx rename to pythonwin/Scintilla/src/PositionCache.cxx diff --git a/Pythonwin/Scintilla/src/PositionCache.h b/pythonwin/Scintilla/src/PositionCache.h similarity index 100% rename from Pythonwin/Scintilla/src/PositionCache.h rename to pythonwin/Scintilla/src/PositionCache.h diff --git a/Pythonwin/Scintilla/src/RESearch.cxx b/pythonwin/Scintilla/src/RESearch.cxx similarity index 100% rename from Pythonwin/Scintilla/src/RESearch.cxx rename to pythonwin/Scintilla/src/RESearch.cxx diff --git a/Pythonwin/Scintilla/src/RESearch.h b/pythonwin/Scintilla/src/RESearch.h similarity index 100% rename from Pythonwin/Scintilla/src/RESearch.h rename to pythonwin/Scintilla/src/RESearch.h diff --git a/Pythonwin/Scintilla/src/RunStyles.cxx b/pythonwin/Scintilla/src/RunStyles.cxx similarity index 100% rename from Pythonwin/Scintilla/src/RunStyles.cxx rename to pythonwin/Scintilla/src/RunStyles.cxx diff --git a/Pythonwin/Scintilla/src/RunStyles.h b/pythonwin/Scintilla/src/RunStyles.h similarity index 100% rename from Pythonwin/Scintilla/src/RunStyles.h rename to pythonwin/Scintilla/src/RunStyles.h diff --git a/Pythonwin/Scintilla/src/SciTE.properties b/pythonwin/Scintilla/src/SciTE.properties similarity index 100% rename from Pythonwin/Scintilla/src/SciTE.properties rename to pythonwin/Scintilla/src/SciTE.properties diff --git a/Pythonwin/Scintilla/src/ScintillaBase.cxx b/pythonwin/Scintilla/src/ScintillaBase.cxx similarity index 100% rename from Pythonwin/Scintilla/src/ScintillaBase.cxx rename to pythonwin/Scintilla/src/ScintillaBase.cxx diff --git a/Pythonwin/Scintilla/src/ScintillaBase.h b/pythonwin/Scintilla/src/ScintillaBase.h similarity index 100% rename from Pythonwin/Scintilla/src/ScintillaBase.h rename to pythonwin/Scintilla/src/ScintillaBase.h diff --git a/Pythonwin/Scintilla/src/Selection.cxx b/pythonwin/Scintilla/src/Selection.cxx similarity index 100% rename from Pythonwin/Scintilla/src/Selection.cxx rename to pythonwin/Scintilla/src/Selection.cxx diff --git a/Pythonwin/Scintilla/src/Selection.h b/pythonwin/Scintilla/src/Selection.h similarity index 100% rename from Pythonwin/Scintilla/src/Selection.h rename to pythonwin/Scintilla/src/Selection.h diff --git a/Pythonwin/Scintilla/src/SparseVector.h b/pythonwin/Scintilla/src/SparseVector.h similarity index 100% rename from Pythonwin/Scintilla/src/SparseVector.h rename to pythonwin/Scintilla/src/SparseVector.h diff --git a/Pythonwin/Scintilla/src/SplitVector.h b/pythonwin/Scintilla/src/SplitVector.h similarity index 100% rename from Pythonwin/Scintilla/src/SplitVector.h rename to pythonwin/Scintilla/src/SplitVector.h diff --git a/Pythonwin/Scintilla/src/Style.cxx b/pythonwin/Scintilla/src/Style.cxx similarity index 100% rename from Pythonwin/Scintilla/src/Style.cxx rename to pythonwin/Scintilla/src/Style.cxx diff --git a/Pythonwin/Scintilla/src/Style.h b/pythonwin/Scintilla/src/Style.h similarity index 100% rename from Pythonwin/Scintilla/src/Style.h rename to pythonwin/Scintilla/src/Style.h diff --git a/Pythonwin/Scintilla/src/UniConversion.cxx b/pythonwin/Scintilla/src/UniConversion.cxx similarity index 100% rename from Pythonwin/Scintilla/src/UniConversion.cxx rename to pythonwin/Scintilla/src/UniConversion.cxx diff --git a/Pythonwin/Scintilla/src/UniConversion.h b/pythonwin/Scintilla/src/UniConversion.h similarity index 100% rename from Pythonwin/Scintilla/src/UniConversion.h rename to pythonwin/Scintilla/src/UniConversion.h diff --git a/Pythonwin/Scintilla/src/UniqueString.cxx b/pythonwin/Scintilla/src/UniqueString.cxx similarity index 100% rename from Pythonwin/Scintilla/src/UniqueString.cxx rename to pythonwin/Scintilla/src/UniqueString.cxx diff --git a/Pythonwin/Scintilla/src/UniqueString.h b/pythonwin/Scintilla/src/UniqueString.h similarity index 100% rename from Pythonwin/Scintilla/src/UniqueString.h rename to pythonwin/Scintilla/src/UniqueString.h diff --git a/Pythonwin/Scintilla/src/ViewStyle.cxx b/pythonwin/Scintilla/src/ViewStyle.cxx similarity index 100% rename from Pythonwin/Scintilla/src/ViewStyle.cxx rename to pythonwin/Scintilla/src/ViewStyle.cxx diff --git a/Pythonwin/Scintilla/src/ViewStyle.h b/pythonwin/Scintilla/src/ViewStyle.h similarity index 100% rename from Pythonwin/Scintilla/src/ViewStyle.h rename to pythonwin/Scintilla/src/ViewStyle.h diff --git a/Pythonwin/Scintilla/src/XPM.cxx b/pythonwin/Scintilla/src/XPM.cxx similarity index 100% rename from Pythonwin/Scintilla/src/XPM.cxx rename to pythonwin/Scintilla/src/XPM.cxx diff --git a/Pythonwin/Scintilla/src/XPM.h b/pythonwin/Scintilla/src/XPM.h similarity index 100% rename from Pythonwin/Scintilla/src/XPM.h rename to pythonwin/Scintilla/src/XPM.h diff --git a/Pythonwin/Scintilla/win32/DepGen.py b/pythonwin/Scintilla/win32/DepGen.py similarity index 100% rename from Pythonwin/Scintilla/win32/DepGen.py rename to pythonwin/Scintilla/win32/DepGen.py diff --git a/Pythonwin/Scintilla/win32/HanjaDic.cxx b/pythonwin/Scintilla/win32/HanjaDic.cxx similarity index 100% rename from Pythonwin/Scintilla/win32/HanjaDic.cxx rename to pythonwin/Scintilla/win32/HanjaDic.cxx diff --git a/Pythonwin/Scintilla/win32/HanjaDic.h b/pythonwin/Scintilla/win32/HanjaDic.h similarity index 100% rename from Pythonwin/Scintilla/win32/HanjaDic.h rename to pythonwin/Scintilla/win32/HanjaDic.h diff --git a/Pythonwin/Scintilla/win32/PlatWin.cxx b/pythonwin/Scintilla/win32/PlatWin.cxx similarity index 100% rename from Pythonwin/Scintilla/win32/PlatWin.cxx rename to pythonwin/Scintilla/win32/PlatWin.cxx diff --git a/Pythonwin/Scintilla/win32/PlatWin.h b/pythonwin/Scintilla/win32/PlatWin.h similarity index 100% rename from Pythonwin/Scintilla/win32/PlatWin.h rename to pythonwin/Scintilla/win32/PlatWin.h diff --git a/Pythonwin/Scintilla/win32/SciLexer.vcxproj b/pythonwin/Scintilla/win32/SciLexer.vcxproj similarity index 100% rename from Pythonwin/Scintilla/win32/SciLexer.vcxproj rename to pythonwin/Scintilla/win32/SciLexer.vcxproj diff --git a/Pythonwin/Scintilla/win32/SciTE.properties b/pythonwin/Scintilla/win32/SciTE.properties similarity index 100% rename from Pythonwin/Scintilla/win32/SciTE.properties rename to pythonwin/Scintilla/win32/SciTE.properties diff --git a/Pythonwin/Scintilla/win32/ScintRes.rc b/pythonwin/Scintilla/win32/ScintRes.rc similarity index 100% rename from Pythonwin/Scintilla/win32/ScintRes.rc rename to pythonwin/Scintilla/win32/ScintRes.rc diff --git a/Pythonwin/Scintilla/win32/Scintilla.def b/pythonwin/Scintilla/win32/Scintilla.def similarity index 100% rename from Pythonwin/Scintilla/win32/Scintilla.def rename to pythonwin/Scintilla/win32/Scintilla.def diff --git a/Pythonwin/Scintilla/win32/Scintilla.vcxproj b/pythonwin/Scintilla/win32/Scintilla.vcxproj similarity index 100% rename from Pythonwin/Scintilla/win32/Scintilla.vcxproj rename to pythonwin/Scintilla/win32/Scintilla.vcxproj diff --git a/Pythonwin/Scintilla/win32/ScintillaDLL.cxx b/pythonwin/Scintilla/win32/ScintillaDLL.cxx similarity index 100% rename from Pythonwin/Scintilla/win32/ScintillaDLL.cxx rename to pythonwin/Scintilla/win32/ScintillaDLL.cxx diff --git a/Pythonwin/Scintilla/win32/ScintillaWin.cxx b/pythonwin/Scintilla/win32/ScintillaWin.cxx similarity index 100% rename from Pythonwin/Scintilla/win32/ScintillaWin.cxx rename to pythonwin/Scintilla/win32/ScintillaWin.cxx diff --git a/Pythonwin/Scintilla/win32/ScintillaWin.h b/pythonwin/Scintilla/win32/ScintillaWin.h similarity index 100% rename from Pythonwin/Scintilla/win32/ScintillaWin.h rename to pythonwin/Scintilla/win32/ScintillaWin.h diff --git a/Pythonwin/Scintilla/win32/deps.mak b/pythonwin/Scintilla/win32/deps.mak similarity index 100% rename from Pythonwin/Scintilla/win32/deps.mak rename to pythonwin/Scintilla/win32/deps.mak diff --git a/Pythonwin/Scintilla/win32/makefile b/pythonwin/Scintilla/win32/makefile similarity index 100% rename from Pythonwin/Scintilla/win32/makefile rename to pythonwin/Scintilla/win32/makefile diff --git a/Pythonwin/Scintilla/win32/nmdeps.mak b/pythonwin/Scintilla/win32/nmdeps.mak similarity index 100% rename from Pythonwin/Scintilla/win32/nmdeps.mak rename to pythonwin/Scintilla/win32/nmdeps.mak diff --git a/Pythonwin/Scintilla/win32/scintilla.mak b/pythonwin/Scintilla/win32/scintilla.mak similarity index 100% rename from Pythonwin/Scintilla/win32/scintilla.mak rename to pythonwin/Scintilla/win32/scintilla.mak diff --git a/Pythonwin/Win32app.h b/pythonwin/Win32app.h similarity index 100% rename from Pythonwin/Win32app.h rename to pythonwin/Win32app.h diff --git a/Pythonwin/Win32uiHostGlue.h b/pythonwin/Win32uiHostGlue.h similarity index 100% rename from Pythonwin/Win32uiHostGlue.h rename to pythonwin/Win32uiHostGlue.h diff --git a/Pythonwin/contents.d b/pythonwin/contents.d similarity index 100% rename from Pythonwin/contents.d rename to pythonwin/contents.d diff --git a/Pythonwin/dbgthread.cpp b/pythonwin/dbgthread.cpp similarity index 100% rename from Pythonwin/dbgthread.cpp rename to pythonwin/dbgthread.cpp diff --git a/Pythonwin/ddeconv.cpp b/pythonwin/ddeconv.cpp similarity index 100% rename from Pythonwin/ddeconv.cpp rename to pythonwin/ddeconv.cpp diff --git a/Pythonwin/ddeitem.cpp b/pythonwin/ddeitem.cpp similarity index 100% rename from Pythonwin/ddeitem.cpp rename to pythonwin/ddeitem.cpp diff --git a/Pythonwin/ddemodule.cpp b/pythonwin/ddemodule.cpp similarity index 100% rename from Pythonwin/ddemodule.cpp rename to pythonwin/ddemodule.cpp diff --git a/Pythonwin/ddemodule.h b/pythonwin/ddemodule.h similarity index 100% rename from Pythonwin/ddemodule.h rename to pythonwin/ddemodule.h diff --git a/Pythonwin/ddeserver.cpp b/pythonwin/ddeserver.cpp similarity index 100% rename from Pythonwin/ddeserver.cpp rename to pythonwin/ddeserver.cpp diff --git a/Pythonwin/ddetopic.cpp b/pythonwin/ddetopic.cpp similarity index 100% rename from Pythonwin/ddetopic.cpp rename to pythonwin/ddetopic.cpp diff --git a/Pythonwin/dibapi.cpp b/pythonwin/dibapi.cpp similarity index 100% rename from Pythonwin/dibapi.cpp rename to pythonwin/dibapi.cpp diff --git a/Pythonwin/dibapi.h b/pythonwin/dibapi.h similarity index 100% rename from Pythonwin/dibapi.h rename to pythonwin/dibapi.h diff --git a/Pythonwin/dllmain.cpp b/pythonwin/dllmain.cpp similarity index 100% rename from Pythonwin/dllmain.cpp rename to pythonwin/dllmain.cpp diff --git a/Pythonwin/doc/EmbeddingWin32ui.html b/pythonwin/doc/EmbeddingWin32ui.html similarity index 100% rename from Pythonwin/doc/EmbeddingWin32ui.html rename to pythonwin/doc/EmbeddingWin32ui.html diff --git a/Pythonwin/doc/architecture.html b/pythonwin/doc/architecture.html similarity index 100% rename from Pythonwin/doc/architecture.html rename to pythonwin/doc/architecture.html diff --git a/Pythonwin/doc/debugger/general.html b/pythonwin/doc/debugger/general.html similarity index 100% rename from Pythonwin/doc/debugger/general.html rename to pythonwin/doc/debugger/general.html diff --git a/Pythonwin/doc/debugger/index.html b/pythonwin/doc/debugger/index.html similarity index 100% rename from Pythonwin/doc/debugger/index.html rename to pythonwin/doc/debugger/index.html diff --git a/Pythonwin/doc/debugger/postmortem.gif b/pythonwin/doc/debugger/postmortem.gif similarity index 100% rename from Pythonwin/doc/debugger/postmortem.gif rename to pythonwin/doc/debugger/postmortem.gif diff --git a/Pythonwin/doc/debugger/probs.html b/pythonwin/doc/debugger/probs.html similarity index 100% rename from Pythonwin/doc/debugger/probs.html rename to pythonwin/doc/debugger/probs.html diff --git a/Pythonwin/doc/debugger/pythonwin.gif b/pythonwin/doc/debugger/pythonwin.gif similarity index 100% rename from Pythonwin/doc/debugger/pythonwin.gif rename to pythonwin/doc/debugger/pythonwin.gif diff --git a/Pythonwin/doc/debugger/tut1.gif b/pythonwin/doc/debugger/tut1.gif similarity index 100% rename from Pythonwin/doc/debugger/tut1.gif rename to pythonwin/doc/debugger/tut1.gif diff --git a/Pythonwin/doc/debugger/tutbp1.gif b/pythonwin/doc/debugger/tutbp1.gif similarity index 100% rename from Pythonwin/doc/debugger/tutbp1.gif rename to pythonwin/doc/debugger/tutbp1.gif diff --git a/Pythonwin/doc/debugger/tutorial.html b/pythonwin/doc/debugger/tutorial.html similarity index 100% rename from Pythonwin/doc/debugger/tutorial.html rename to pythonwin/doc/debugger/tutorial.html diff --git a/Pythonwin/doc/docview.html b/pythonwin/doc/docview.html similarity index 100% rename from Pythonwin/doc/docview.html rename to pythonwin/doc/docview.html diff --git a/Pythonwin/doc/guienvironment.html b/pythonwin/doc/guienvironment.html similarity index 100% rename from Pythonwin/doc/guienvironment.html rename to pythonwin/doc/guienvironment.html diff --git a/Pythonwin/doc/pythonwin.gif b/pythonwin/doc/pythonwin.gif similarity index 100% rename from Pythonwin/doc/pythonwin.gif rename to pythonwin/doc/pythonwin.gif diff --git a/Pythonwin/pythonRichEdit.cpp b/pythonwin/pythonRichEdit.cpp similarity index 100% rename from Pythonwin/pythonRichEdit.cpp rename to pythonwin/pythonRichEdit.cpp diff --git a/Pythonwin/pythonRichEdit.h b/pythonwin/pythonRichEdit.h similarity index 100% rename from Pythonwin/pythonRichEdit.h rename to pythonwin/pythonRichEdit.h diff --git a/Pythonwin/pythonRichEditCntr.cpp b/pythonwin/pythonRichEditCntr.cpp similarity index 100% rename from Pythonwin/pythonRichEditCntr.cpp rename to pythonwin/pythonRichEditCntr.cpp diff --git a/Pythonwin/pythonRichEditCntr.h b/pythonwin/pythonRichEditCntr.h similarity index 100% rename from Pythonwin/pythonRichEditCntr.h rename to pythonwin/pythonRichEditCntr.h diff --git a/Pythonwin/pythonRichEditDoc.cpp b/pythonwin/pythonRichEditDoc.cpp similarity index 100% rename from Pythonwin/pythonRichEditDoc.cpp rename to pythonwin/pythonRichEditDoc.cpp diff --git a/Pythonwin/pythonRichEditDoc.h b/pythonwin/pythonRichEditDoc.h similarity index 100% rename from Pythonwin/pythonRichEditDoc.h rename to pythonwin/pythonRichEditDoc.h diff --git a/Pythonwin/pythoncbar.h b/pythonwin/pythoncbar.h similarity index 100% rename from Pythonwin/pythoncbar.h rename to pythonwin/pythoncbar.h diff --git a/Pythonwin/pythondoc.cpp b/pythonwin/pythondoc.cpp similarity index 100% rename from Pythonwin/pythondoc.cpp rename to pythonwin/pythondoc.cpp diff --git a/Pythonwin/pythondoc.h b/pythonwin/pythondoc.h similarity index 100% rename from Pythonwin/pythondoc.h rename to pythonwin/pythondoc.h diff --git a/Pythonwin/pythonframe.h b/pythonwin/pythonframe.h similarity index 100% rename from Pythonwin/pythonframe.h rename to pythonwin/pythonframe.h diff --git a/Pythonwin/pythonppage.cpp b/pythonwin/pythonppage.cpp similarity index 100% rename from Pythonwin/pythonppage.cpp rename to pythonwin/pythonppage.cpp diff --git a/Pythonwin/pythonppage.h b/pythonwin/pythonppage.h similarity index 100% rename from Pythonwin/pythonppage.h rename to pythonwin/pythonppage.h diff --git a/Pythonwin/pythonpsheet.cpp b/pythonwin/pythonpsheet.cpp similarity index 100% rename from Pythonwin/pythonpsheet.cpp rename to pythonwin/pythonpsheet.cpp diff --git a/Pythonwin/pythonpsheet.h b/pythonwin/pythonpsheet.h similarity index 100% rename from Pythonwin/pythonpsheet.h rename to pythonwin/pythonpsheet.h diff --git a/Pythonwin/pythonview.cpp b/pythonwin/pythonview.cpp similarity index 100% rename from Pythonwin/pythonview.cpp rename to pythonwin/pythonview.cpp diff --git a/Pythonwin/pythonview.h b/pythonwin/pythonview.h similarity index 100% rename from Pythonwin/pythonview.h rename to pythonwin/pythonview.h diff --git a/Pythonwin/pythonwin.cpp b/pythonwin/pythonwin.cpp similarity index 100% rename from Pythonwin/pythonwin.cpp rename to pythonwin/pythonwin.cpp diff --git a/Pythonwin/pythonwin.h b/pythonwin/pythonwin.h similarity index 100% rename from Pythonwin/pythonwin.h rename to pythonwin/pythonwin.h diff --git a/Pythonwin/pythonwin.rc b/pythonwin/pythonwin.rc similarity index 100% rename from Pythonwin/pythonwin.rc rename to pythonwin/pythonwin.rc diff --git a/Pythonwin/pywin/Demos/app/basictimerapp.py b/pythonwin/pywin/Demos/app/basictimerapp.py similarity index 100% rename from Pythonwin/pywin/Demos/app/basictimerapp.py rename to pythonwin/pywin/Demos/app/basictimerapp.py diff --git a/Pythonwin/pywin/Demos/app/customprint.py b/pythonwin/pywin/Demos/app/customprint.py similarity index 100% rename from Pythonwin/pywin/Demos/app/customprint.py rename to pythonwin/pywin/Demos/app/customprint.py diff --git a/Pythonwin/pywin/Demos/app/demoutils.py b/pythonwin/pywin/Demos/app/demoutils.py similarity index 100% rename from Pythonwin/pywin/Demos/app/demoutils.py rename to pythonwin/pywin/Demos/app/demoutils.py diff --git a/Pythonwin/pywin/Demos/app/dlgappdemo.py b/pythonwin/pywin/Demos/app/dlgappdemo.py similarity index 100% rename from Pythonwin/pywin/Demos/app/dlgappdemo.py rename to pythonwin/pywin/Demos/app/dlgappdemo.py diff --git a/Pythonwin/pywin/Demos/app/dojobapp.py b/pythonwin/pywin/Demos/app/dojobapp.py similarity index 100% rename from Pythonwin/pywin/Demos/app/dojobapp.py rename to pythonwin/pywin/Demos/app/dojobapp.py diff --git a/Pythonwin/pywin/Demos/app/helloapp.py b/pythonwin/pywin/Demos/app/helloapp.py similarity index 100% rename from Pythonwin/pywin/Demos/app/helloapp.py rename to pythonwin/pywin/Demos/app/helloapp.py diff --git a/Pythonwin/pywin/Demos/app/readme.txt b/pythonwin/pywin/Demos/app/readme.txt similarity index 100% rename from Pythonwin/pywin/Demos/app/readme.txt rename to pythonwin/pywin/Demos/app/readme.txt diff --git a/Pythonwin/pywin/Demos/cmdserver.py b/pythonwin/pywin/Demos/cmdserver.py similarity index 100% rename from Pythonwin/pywin/Demos/cmdserver.py rename to pythonwin/pywin/Demos/cmdserver.py diff --git a/Pythonwin/pywin/Demos/createwin.py b/pythonwin/pywin/Demos/createwin.py similarity index 100% rename from Pythonwin/pywin/Demos/createwin.py rename to pythonwin/pywin/Demos/createwin.py diff --git a/Pythonwin/pywin/Demos/demoutils.py b/pythonwin/pywin/Demos/demoutils.py similarity index 100% rename from Pythonwin/pywin/Demos/demoutils.py rename to pythonwin/pywin/Demos/demoutils.py diff --git a/Pythonwin/pywin/Demos/dibdemo.py b/pythonwin/pywin/Demos/dibdemo.py similarity index 100% rename from Pythonwin/pywin/Demos/dibdemo.py rename to pythonwin/pywin/Demos/dibdemo.py diff --git a/Pythonwin/pywin/Demos/dlgtest.py b/pythonwin/pywin/Demos/dlgtest.py similarity index 100% rename from Pythonwin/pywin/Demos/dlgtest.py rename to pythonwin/pywin/Demos/dlgtest.py diff --git a/Pythonwin/pywin/Demos/dyndlg.py b/pythonwin/pywin/Demos/dyndlg.py similarity index 100% rename from Pythonwin/pywin/Demos/dyndlg.py rename to pythonwin/pywin/Demos/dyndlg.py diff --git a/Pythonwin/pywin/Demos/fontdemo.py b/pythonwin/pywin/Demos/fontdemo.py similarity index 100% rename from Pythonwin/pywin/Demos/fontdemo.py rename to pythonwin/pywin/Demos/fontdemo.py diff --git a/Pythonwin/pywin/Demos/guidemo.py b/pythonwin/pywin/Demos/guidemo.py similarity index 100% rename from Pythonwin/pywin/Demos/guidemo.py rename to pythonwin/pywin/Demos/guidemo.py diff --git a/Pythonwin/pywin/Demos/hiertest.py b/pythonwin/pywin/Demos/hiertest.py similarity index 100% rename from Pythonwin/pywin/Demos/hiertest.py rename to pythonwin/pywin/Demos/hiertest.py diff --git a/Pythonwin/pywin/Demos/menutest.py b/pythonwin/pywin/Demos/menutest.py similarity index 100% rename from Pythonwin/pywin/Demos/menutest.py rename to pythonwin/pywin/Demos/menutest.py diff --git a/Pythonwin/pywin/Demos/objdoc.py b/pythonwin/pywin/Demos/objdoc.py similarity index 100% rename from Pythonwin/pywin/Demos/objdoc.py rename to pythonwin/pywin/Demos/objdoc.py diff --git a/Pythonwin/pywin/Demos/ocx/demoutils.py b/pythonwin/pywin/Demos/ocx/demoutils.py similarity index 100% rename from Pythonwin/pywin/Demos/ocx/demoutils.py rename to pythonwin/pywin/Demos/ocx/demoutils.py diff --git a/Pythonwin/pywin/Demos/ocx/flash.py b/pythonwin/pywin/Demos/ocx/flash.py similarity index 100% rename from Pythonwin/pywin/Demos/ocx/flash.py rename to pythonwin/pywin/Demos/ocx/flash.py diff --git a/Pythonwin/pywin/Demos/ocx/msoffice.py b/pythonwin/pywin/Demos/ocx/msoffice.py similarity index 100% rename from Pythonwin/pywin/Demos/ocx/msoffice.py rename to pythonwin/pywin/Demos/ocx/msoffice.py diff --git a/Pythonwin/pywin/Demos/ocx/ocxserialtest.py b/pythonwin/pywin/Demos/ocx/ocxserialtest.py similarity index 100% rename from Pythonwin/pywin/Demos/ocx/ocxserialtest.py rename to pythonwin/pywin/Demos/ocx/ocxserialtest.py diff --git a/Pythonwin/pywin/Demos/ocx/ocxtest.py b/pythonwin/pywin/Demos/ocx/ocxtest.py similarity index 100% rename from Pythonwin/pywin/Demos/ocx/ocxtest.py rename to pythonwin/pywin/Demos/ocx/ocxtest.py diff --git a/Pythonwin/pywin/Demos/ocx/webbrowser.py b/pythonwin/pywin/Demos/ocx/webbrowser.py similarity index 100% rename from Pythonwin/pywin/Demos/ocx/webbrowser.py rename to pythonwin/pywin/Demos/ocx/webbrowser.py diff --git a/Pythonwin/pywin/Demos/openGLDemo.py b/pythonwin/pywin/Demos/openGLDemo.py similarity index 100% rename from Pythonwin/pywin/Demos/openGLDemo.py rename to pythonwin/pywin/Demos/openGLDemo.py diff --git a/Pythonwin/pywin/Demos/progressbar.py b/pythonwin/pywin/Demos/progressbar.py similarity index 100% rename from Pythonwin/pywin/Demos/progressbar.py rename to pythonwin/pywin/Demos/progressbar.py diff --git a/Pythonwin/pywin/Demos/readme.txt b/pythonwin/pywin/Demos/readme.txt similarity index 100% rename from Pythonwin/pywin/Demos/readme.txt rename to pythonwin/pywin/Demos/readme.txt diff --git a/Pythonwin/pywin/Demos/sliderdemo.py b/pythonwin/pywin/Demos/sliderdemo.py similarity index 100% rename from Pythonwin/pywin/Demos/sliderdemo.py rename to pythonwin/pywin/Demos/sliderdemo.py diff --git a/Pythonwin/pywin/Demos/splittst.py b/pythonwin/pywin/Demos/splittst.py similarity index 100% rename from Pythonwin/pywin/Demos/splittst.py rename to pythonwin/pywin/Demos/splittst.py diff --git a/Pythonwin/pywin/Demos/threadedgui.py b/pythonwin/pywin/Demos/threadedgui.py similarity index 100% rename from Pythonwin/pywin/Demos/threadedgui.py rename to pythonwin/pywin/Demos/threadedgui.py diff --git a/Pythonwin/pywin/Demos/toolbar.py b/pythonwin/pywin/Demos/toolbar.py similarity index 100% rename from Pythonwin/pywin/Demos/toolbar.py rename to pythonwin/pywin/Demos/toolbar.py diff --git a/Pythonwin/pywin/IDLE.cfg b/pythonwin/pywin/IDLE.cfg similarity index 100% rename from Pythonwin/pywin/IDLE.cfg rename to pythonwin/pywin/IDLE.cfg diff --git a/Pythonwin/pywin/__init__.py b/pythonwin/pywin/__init__.py similarity index 100% rename from Pythonwin/pywin/__init__.py rename to pythonwin/pywin/__init__.py diff --git a/Pythonwin/pywin/debugger/__init__.py b/pythonwin/pywin/debugger/__init__.py similarity index 100% rename from Pythonwin/pywin/debugger/__init__.py rename to pythonwin/pywin/debugger/__init__.py diff --git a/Pythonwin/pywin/debugger/configui.py b/pythonwin/pywin/debugger/configui.py similarity index 100% rename from Pythonwin/pywin/debugger/configui.py rename to pythonwin/pywin/debugger/configui.py diff --git a/Pythonwin/pywin/debugger/dbgcon.py b/pythonwin/pywin/debugger/dbgcon.py similarity index 100% rename from Pythonwin/pywin/debugger/dbgcon.py rename to pythonwin/pywin/debugger/dbgcon.py diff --git a/Pythonwin/pywin/debugger/dbgpyapp.py b/pythonwin/pywin/debugger/dbgpyapp.py similarity index 100% rename from Pythonwin/pywin/debugger/dbgpyapp.py rename to pythonwin/pywin/debugger/dbgpyapp.py diff --git a/Pythonwin/pywin/debugger/debugger.py b/pythonwin/pywin/debugger/debugger.py similarity index 100% rename from Pythonwin/pywin/debugger/debugger.py rename to pythonwin/pywin/debugger/debugger.py diff --git a/Pythonwin/pywin/debugger/fail.py b/pythonwin/pywin/debugger/fail.py similarity index 100% rename from Pythonwin/pywin/debugger/fail.py rename to pythonwin/pywin/debugger/fail.py diff --git a/Pythonwin/pywin/default.cfg b/pythonwin/pywin/default.cfg similarity index 100% rename from Pythonwin/pywin/default.cfg rename to pythonwin/pywin/default.cfg diff --git a/Pythonwin/pywin/dialogs/__init__.py b/pythonwin/pywin/dialogs/__init__.py similarity index 100% rename from Pythonwin/pywin/dialogs/__init__.py rename to pythonwin/pywin/dialogs/__init__.py diff --git a/Pythonwin/pywin/dialogs/ideoptions.py b/pythonwin/pywin/dialogs/ideoptions.py similarity index 100% rename from Pythonwin/pywin/dialogs/ideoptions.py rename to pythonwin/pywin/dialogs/ideoptions.py diff --git a/Pythonwin/pywin/dialogs/list.py b/pythonwin/pywin/dialogs/list.py similarity index 100% rename from Pythonwin/pywin/dialogs/list.py rename to pythonwin/pywin/dialogs/list.py diff --git a/Pythonwin/pywin/dialogs/login.py b/pythonwin/pywin/dialogs/login.py similarity index 100% rename from Pythonwin/pywin/dialogs/login.py rename to pythonwin/pywin/dialogs/login.py diff --git a/Pythonwin/pywin/dialogs/status.py b/pythonwin/pywin/dialogs/status.py similarity index 100% rename from Pythonwin/pywin/dialogs/status.py rename to pythonwin/pywin/dialogs/status.py diff --git a/Pythonwin/pywin/docking/DockingBar.py b/pythonwin/pywin/docking/DockingBar.py similarity index 100% rename from Pythonwin/pywin/docking/DockingBar.py rename to pythonwin/pywin/docking/DockingBar.py diff --git a/Pythonwin/pywin/docking/__init__.py b/pythonwin/pywin/docking/__init__.py similarity index 100% rename from Pythonwin/pywin/docking/__init__.py rename to pythonwin/pywin/docking/__init__.py diff --git a/Pythonwin/pywin/framework/__init__.py b/pythonwin/pywin/framework/__init__.py similarity index 100% rename from Pythonwin/pywin/framework/__init__.py rename to pythonwin/pywin/framework/__init__.py diff --git a/Pythonwin/pywin/framework/app.py b/pythonwin/pywin/framework/app.py similarity index 100% rename from Pythonwin/pywin/framework/app.py rename to pythonwin/pywin/framework/app.py diff --git a/Pythonwin/pywin/framework/bitmap.py b/pythonwin/pywin/framework/bitmap.py similarity index 100% rename from Pythonwin/pywin/framework/bitmap.py rename to pythonwin/pywin/framework/bitmap.py diff --git a/Pythonwin/pywin/framework/cmdline.py b/pythonwin/pywin/framework/cmdline.py similarity index 100% rename from Pythonwin/pywin/framework/cmdline.py rename to pythonwin/pywin/framework/cmdline.py diff --git a/Pythonwin/pywin/framework/dbgcommands.py b/pythonwin/pywin/framework/dbgcommands.py similarity index 100% rename from Pythonwin/pywin/framework/dbgcommands.py rename to pythonwin/pywin/framework/dbgcommands.py diff --git a/Pythonwin/pywin/framework/dlgappcore.py b/pythonwin/pywin/framework/dlgappcore.py similarity index 100% rename from Pythonwin/pywin/framework/dlgappcore.py rename to pythonwin/pywin/framework/dlgappcore.py diff --git a/Pythonwin/pywin/framework/editor/ModuleBrowser.py b/pythonwin/pywin/framework/editor/ModuleBrowser.py similarity index 100% rename from Pythonwin/pywin/framework/editor/ModuleBrowser.py rename to pythonwin/pywin/framework/editor/ModuleBrowser.py diff --git a/Pythonwin/pywin/framework/editor/__init__.py b/pythonwin/pywin/framework/editor/__init__.py similarity index 100% rename from Pythonwin/pywin/framework/editor/__init__.py rename to pythonwin/pywin/framework/editor/__init__.py diff --git a/Pythonwin/pywin/framework/editor/color/__init__.py b/pythonwin/pywin/framework/editor/color/__init__.py similarity index 100% rename from Pythonwin/pywin/framework/editor/color/__init__.py rename to pythonwin/pywin/framework/editor/color/__init__.py diff --git a/Pythonwin/pywin/framework/editor/color/coloreditor.py b/pythonwin/pywin/framework/editor/color/coloreditor.py similarity index 100% rename from Pythonwin/pywin/framework/editor/color/coloreditor.py rename to pythonwin/pywin/framework/editor/color/coloreditor.py diff --git a/Pythonwin/pywin/framework/editor/configui.py b/pythonwin/pywin/framework/editor/configui.py similarity index 100% rename from Pythonwin/pywin/framework/editor/configui.py rename to pythonwin/pywin/framework/editor/configui.py diff --git a/Pythonwin/pywin/framework/editor/document.py b/pythonwin/pywin/framework/editor/document.py similarity index 100% rename from Pythonwin/pywin/framework/editor/document.py rename to pythonwin/pywin/framework/editor/document.py diff --git a/Pythonwin/pywin/framework/editor/editor.py b/pythonwin/pywin/framework/editor/editor.py similarity index 100% rename from Pythonwin/pywin/framework/editor/editor.py rename to pythonwin/pywin/framework/editor/editor.py diff --git a/Pythonwin/pywin/framework/editor/frame.py b/pythonwin/pywin/framework/editor/frame.py similarity index 100% rename from Pythonwin/pywin/framework/editor/frame.py rename to pythonwin/pywin/framework/editor/frame.py diff --git a/Pythonwin/pywin/framework/editor/template.py b/pythonwin/pywin/framework/editor/template.py similarity index 100% rename from Pythonwin/pywin/framework/editor/template.py rename to pythonwin/pywin/framework/editor/template.py diff --git a/Pythonwin/pywin/framework/editor/vss.py b/pythonwin/pywin/framework/editor/vss.py similarity index 100% rename from Pythonwin/pywin/framework/editor/vss.py rename to pythonwin/pywin/framework/editor/vss.py diff --git a/Pythonwin/pywin/framework/help.py b/pythonwin/pywin/framework/help.py similarity index 100% rename from Pythonwin/pywin/framework/help.py rename to pythonwin/pywin/framework/help.py diff --git a/Pythonwin/pywin/framework/interact.py b/pythonwin/pywin/framework/interact.py similarity index 100% rename from Pythonwin/pywin/framework/interact.py rename to pythonwin/pywin/framework/interact.py diff --git a/Pythonwin/pywin/framework/intpyapp.py b/pythonwin/pywin/framework/intpyapp.py similarity index 100% rename from Pythonwin/pywin/framework/intpyapp.py rename to pythonwin/pywin/framework/intpyapp.py diff --git a/Pythonwin/pywin/framework/intpydde.py b/pythonwin/pywin/framework/intpydde.py similarity index 100% rename from Pythonwin/pywin/framework/intpydde.py rename to pythonwin/pywin/framework/intpydde.py diff --git a/Pythonwin/pywin/framework/scriptutils.py b/pythonwin/pywin/framework/scriptutils.py similarity index 100% rename from Pythonwin/pywin/framework/scriptutils.py rename to pythonwin/pywin/framework/scriptutils.py diff --git a/Pythonwin/pywin/framework/sgrepmdi.py b/pythonwin/pywin/framework/sgrepmdi.py similarity index 100% rename from Pythonwin/pywin/framework/sgrepmdi.py rename to pythonwin/pywin/framework/sgrepmdi.py diff --git a/Pythonwin/pywin/framework/startup.py b/pythonwin/pywin/framework/startup.py similarity index 100% rename from Pythonwin/pywin/framework/startup.py rename to pythonwin/pywin/framework/startup.py diff --git a/Pythonwin/pywin/framework/stdin.py b/pythonwin/pywin/framework/stdin.py similarity index 100% rename from Pythonwin/pywin/framework/stdin.py rename to pythonwin/pywin/framework/stdin.py diff --git a/Pythonwin/pywin/framework/toolmenu.py b/pythonwin/pywin/framework/toolmenu.py similarity index 100% rename from Pythonwin/pywin/framework/toolmenu.py rename to pythonwin/pywin/framework/toolmenu.py diff --git a/Pythonwin/pywin/framework/window.py b/pythonwin/pywin/framework/window.py similarity index 100% rename from Pythonwin/pywin/framework/window.py rename to pythonwin/pywin/framework/window.py diff --git a/Pythonwin/pywin/framework/winout.py b/pythonwin/pywin/framework/winout.py similarity index 100% rename from Pythonwin/pywin/framework/winout.py rename to pythonwin/pywin/framework/winout.py diff --git a/Pythonwin/pywin/idle/AutoExpand.py b/pythonwin/pywin/idle/AutoExpand.py similarity index 100% rename from Pythonwin/pywin/idle/AutoExpand.py rename to pythonwin/pywin/idle/AutoExpand.py diff --git a/Pythonwin/pywin/idle/AutoIndent.py b/pythonwin/pywin/idle/AutoIndent.py similarity index 100% rename from Pythonwin/pywin/idle/AutoIndent.py rename to pythonwin/pywin/idle/AutoIndent.py diff --git a/Pythonwin/pywin/idle/CallTips.py b/pythonwin/pywin/idle/CallTips.py similarity index 100% rename from Pythonwin/pywin/idle/CallTips.py rename to pythonwin/pywin/idle/CallTips.py diff --git a/Pythonwin/pywin/idle/FormatParagraph.py b/pythonwin/pywin/idle/FormatParagraph.py similarity index 100% rename from Pythonwin/pywin/idle/FormatParagraph.py rename to pythonwin/pywin/idle/FormatParagraph.py diff --git a/Pythonwin/pywin/idle/IdleHistory.py b/pythonwin/pywin/idle/IdleHistory.py similarity index 100% rename from Pythonwin/pywin/idle/IdleHistory.py rename to pythonwin/pywin/idle/IdleHistory.py diff --git a/Pythonwin/pywin/idle/PyParse.py b/pythonwin/pywin/idle/PyParse.py similarity index 100% rename from Pythonwin/pywin/idle/PyParse.py rename to pythonwin/pywin/idle/PyParse.py diff --git a/Pythonwin/pywin/idle/__init__.py b/pythonwin/pywin/idle/__init__.py similarity index 100% rename from Pythonwin/pywin/idle/__init__.py rename to pythonwin/pywin/idle/__init__.py diff --git a/Pythonwin/pywin/idle/readme.md b/pythonwin/pywin/idle/readme.md similarity index 100% rename from Pythonwin/pywin/idle/readme.md rename to pythonwin/pywin/idle/readme.md diff --git a/Pythonwin/pywin/mfc/__init__.py b/pythonwin/pywin/mfc/__init__.py similarity index 100% rename from Pythonwin/pywin/mfc/__init__.py rename to pythonwin/pywin/mfc/__init__.py diff --git a/Pythonwin/pywin/mfc/activex.py b/pythonwin/pywin/mfc/activex.py similarity index 100% rename from Pythonwin/pywin/mfc/activex.py rename to pythonwin/pywin/mfc/activex.py diff --git a/Pythonwin/pywin/mfc/afxres.py b/pythonwin/pywin/mfc/afxres.py similarity index 100% rename from Pythonwin/pywin/mfc/afxres.py rename to pythonwin/pywin/mfc/afxres.py diff --git a/Pythonwin/pywin/mfc/dialog.py b/pythonwin/pywin/mfc/dialog.py similarity index 100% rename from Pythonwin/pywin/mfc/dialog.py rename to pythonwin/pywin/mfc/dialog.py diff --git a/Pythonwin/pywin/mfc/docview.py b/pythonwin/pywin/mfc/docview.py similarity index 100% rename from Pythonwin/pywin/mfc/docview.py rename to pythonwin/pywin/mfc/docview.py diff --git a/Pythonwin/pywin/mfc/object.py b/pythonwin/pywin/mfc/object.py similarity index 100% rename from Pythonwin/pywin/mfc/object.py rename to pythonwin/pywin/mfc/object.py diff --git a/Pythonwin/pywin/mfc/thread.py b/pythonwin/pywin/mfc/thread.py similarity index 100% rename from Pythonwin/pywin/mfc/thread.py rename to pythonwin/pywin/mfc/thread.py diff --git a/Pythonwin/pywin/mfc/window.py b/pythonwin/pywin/mfc/window.py similarity index 100% rename from Pythonwin/pywin/mfc/window.py rename to pythonwin/pywin/mfc/window.py diff --git a/Pythonwin/pywin/scintilla/IDLEenvironment.py b/pythonwin/pywin/scintilla/IDLEenvironment.py similarity index 100% rename from Pythonwin/pywin/scintilla/IDLEenvironment.py rename to pythonwin/pywin/scintilla/IDLEenvironment.py diff --git a/Pythonwin/pywin/scintilla/__init__.py b/pythonwin/pywin/scintilla/__init__.py similarity index 100% rename from Pythonwin/pywin/scintilla/__init__.py rename to pythonwin/pywin/scintilla/__init__.py diff --git a/Pythonwin/pywin/scintilla/bindings.py b/pythonwin/pywin/scintilla/bindings.py similarity index 100% rename from Pythonwin/pywin/scintilla/bindings.py rename to pythonwin/pywin/scintilla/bindings.py diff --git a/Pythonwin/pywin/scintilla/config.py b/pythonwin/pywin/scintilla/config.py similarity index 100% rename from Pythonwin/pywin/scintilla/config.py rename to pythonwin/pywin/scintilla/config.py diff --git a/Pythonwin/pywin/scintilla/configui.py b/pythonwin/pywin/scintilla/configui.py similarity index 100% rename from Pythonwin/pywin/scintilla/configui.py rename to pythonwin/pywin/scintilla/configui.py diff --git a/Pythonwin/pywin/scintilla/control.py b/pythonwin/pywin/scintilla/control.py similarity index 100% rename from Pythonwin/pywin/scintilla/control.py rename to pythonwin/pywin/scintilla/control.py diff --git a/Pythonwin/pywin/scintilla/document.py b/pythonwin/pywin/scintilla/document.py similarity index 100% rename from Pythonwin/pywin/scintilla/document.py rename to pythonwin/pywin/scintilla/document.py diff --git a/Pythonwin/pywin/scintilla/find.py b/pythonwin/pywin/scintilla/find.py similarity index 100% rename from Pythonwin/pywin/scintilla/find.py rename to pythonwin/pywin/scintilla/find.py diff --git a/Pythonwin/pywin/scintilla/formatter.py b/pythonwin/pywin/scintilla/formatter.py similarity index 100% rename from Pythonwin/pywin/scintilla/formatter.py rename to pythonwin/pywin/scintilla/formatter.py diff --git a/Pythonwin/pywin/scintilla/keycodes.py b/pythonwin/pywin/scintilla/keycodes.py similarity index 100% rename from Pythonwin/pywin/scintilla/keycodes.py rename to pythonwin/pywin/scintilla/keycodes.py diff --git a/Pythonwin/pywin/scintilla/scintillacon.py b/pythonwin/pywin/scintilla/scintillacon.py similarity index 100% rename from Pythonwin/pywin/scintilla/scintillacon.py rename to pythonwin/pywin/scintilla/scintillacon.py diff --git a/Pythonwin/pywin/scintilla/view.py b/pythonwin/pywin/scintilla/view.py similarity index 100% rename from Pythonwin/pywin/scintilla/view.py rename to pythonwin/pywin/scintilla/view.py diff --git a/Pythonwin/pywin/test/_dbgscript.py b/pythonwin/pywin/test/_dbgscript.py similarity index 100% rename from Pythonwin/pywin/test/_dbgscript.py rename to pythonwin/pywin/test/_dbgscript.py diff --git a/Pythonwin/pywin/test/_exetestscript.py b/pythonwin/pywin/test/_exetestscript.py similarity index 100% rename from Pythonwin/pywin/test/_exetestscript.py rename to pythonwin/pywin/test/_exetestscript.py diff --git a/Pythonwin/pywin/test/all.py b/pythonwin/pywin/test/all.py similarity index 100% rename from Pythonwin/pywin/test/all.py rename to pythonwin/pywin/test/all.py diff --git a/Pythonwin/pywin/test/test_exe.py b/pythonwin/pywin/test/test_exe.py similarity index 100% rename from Pythonwin/pywin/test/test_exe.py rename to pythonwin/pywin/test/test_exe.py diff --git a/Pythonwin/pywin/test/test_pywin.py b/pythonwin/pywin/test/test_pywin.py similarity index 100% rename from Pythonwin/pywin/test/test_pywin.py rename to pythonwin/pywin/test/test_pywin.py diff --git a/Pythonwin/pywin/tools/TraceCollector.py b/pythonwin/pywin/tools/TraceCollector.py similarity index 100% rename from Pythonwin/pywin/tools/TraceCollector.py rename to pythonwin/pywin/tools/TraceCollector.py diff --git a/Pythonwin/pywin/tools/__init__.py b/pythonwin/pywin/tools/__init__.py similarity index 100% rename from Pythonwin/pywin/tools/__init__.py rename to pythonwin/pywin/tools/__init__.py diff --git a/Pythonwin/pywin/tools/browseProjects.py b/pythonwin/pywin/tools/browseProjects.py similarity index 100% rename from Pythonwin/pywin/tools/browseProjects.py rename to pythonwin/pywin/tools/browseProjects.py diff --git a/Pythonwin/pywin/tools/browser.py b/pythonwin/pywin/tools/browser.py similarity index 100% rename from Pythonwin/pywin/tools/browser.py rename to pythonwin/pywin/tools/browser.py diff --git a/Pythonwin/pywin/tools/hierlist.py b/pythonwin/pywin/tools/hierlist.py similarity index 100% rename from Pythonwin/pywin/tools/hierlist.py rename to pythonwin/pywin/tools/hierlist.py diff --git a/Pythonwin/pywin/tools/regedit.py b/pythonwin/pywin/tools/regedit.py similarity index 100% rename from Pythonwin/pywin/tools/regedit.py rename to pythonwin/pywin/tools/regedit.py diff --git a/Pythonwin/pywin/tools/regpy.py b/pythonwin/pywin/tools/regpy.py similarity index 100% rename from Pythonwin/pywin/tools/regpy.py rename to pythonwin/pywin/tools/regpy.py diff --git a/Pythonwin/readme.html b/pythonwin/readme.html similarity index 100% rename from Pythonwin/readme.html rename to pythonwin/readme.html diff --git a/Pythonwin/res/BROWSER.BMP b/pythonwin/res/BROWSER.BMP similarity index 100% rename from Pythonwin/res/BROWSER.BMP rename to pythonwin/res/BROWSER.BMP diff --git a/Pythonwin/res/HIERFOLD.BMP b/pythonwin/res/HIERFOLD.BMP similarity index 100% rename from Pythonwin/res/HIERFOLD.BMP rename to pythonwin/res/HIERFOLD.BMP diff --git a/Pythonwin/res/ICO00002.ICO b/pythonwin/res/ICO00002.ICO similarity index 100% rename from Pythonwin/res/ICO00002.ICO rename to pythonwin/res/ICO00002.ICO diff --git a/Pythonwin/res/IDR_MAIN.ICO b/pythonwin/res/IDR_MAIN.ICO similarity index 100% rename from Pythonwin/res/IDR_MAIN.ICO rename to pythonwin/res/IDR_MAIN.ICO diff --git a/Pythonwin/res/IDR_PYTH.ICO b/pythonwin/res/IDR_PYTH.ICO similarity index 100% rename from Pythonwin/res/IDR_PYTH.ICO rename to pythonwin/res/IDR_PYTH.ICO diff --git a/Pythonwin/res/PADDOC.ICO b/pythonwin/res/PADDOC.ICO similarity index 100% rename from Pythonwin/res/PADDOC.ICO rename to pythonwin/res/PADDOC.ICO diff --git a/Pythonwin/res/debugger.ico b/pythonwin/res/debugger.ico similarity index 100% rename from Pythonwin/res/debugger.ico rename to pythonwin/res/debugger.ico diff --git a/Pythonwin/res/debugger_stack.bmp b/pythonwin/res/debugger_stack.bmp similarity index 100% rename from Pythonwin/res/debugger_stack.bmp rename to pythonwin/res/debugger_stack.bmp diff --git a/Pythonwin/res/pyc.ico b/pythonwin/res/pyc.ico similarity index 100% rename from Pythonwin/res/pyc.ico rename to pythonwin/res/pyc.ico diff --git a/Pythonwin/res/pycon.ico b/pythonwin/res/pycon.ico similarity index 100% rename from Pythonwin/res/pycon.ico rename to pythonwin/res/pycon.ico diff --git a/Pythonwin/res/temp.BMP b/pythonwin/res/temp.BMP similarity index 100% rename from Pythonwin/res/temp.BMP rename to pythonwin/res/temp.BMP diff --git a/Pythonwin/res/toolbar.bmp b/pythonwin/res/toolbar.bmp similarity index 100% rename from Pythonwin/res/toolbar.bmp rename to pythonwin/res/toolbar.bmp diff --git a/Pythonwin/res/toolbar_debugger.bmp b/pythonwin/res/toolbar_debugger.bmp similarity index 100% rename from Pythonwin/res/toolbar_debugger.bmp rename to pythonwin/res/toolbar_debugger.bmp diff --git a/Pythonwin/respw.h b/pythonwin/respw.h similarity index 100% rename from Pythonwin/respw.h rename to pythonwin/respw.h diff --git a/Pythonwin/reswin32ui.h b/pythonwin/reswin32ui.h similarity index 100% rename from Pythonwin/reswin32ui.h rename to pythonwin/reswin32ui.h diff --git a/Pythonwin/start_pythonwin.pyw b/pythonwin/start_pythonwin.pyw similarity index 100% rename from Pythonwin/start_pythonwin.pyw rename to pythonwin/start_pythonwin.pyw diff --git a/Pythonwin/stdafx.cpp b/pythonwin/stdafx.cpp similarity index 100% rename from Pythonwin/stdafx.cpp rename to pythonwin/stdafx.cpp diff --git a/Pythonwin/stdafx.h b/pythonwin/stdafx.h similarity index 100% rename from Pythonwin/stdafx.h rename to pythonwin/stdafx.h diff --git a/Pythonwin/stdafxdde.h b/pythonwin/stdafxdde.h similarity index 100% rename from Pythonwin/stdafxdde.h rename to pythonwin/stdafxdde.h diff --git a/Pythonwin/stdafxole.cpp b/pythonwin/stdafxole.cpp similarity index 100% rename from Pythonwin/stdafxole.cpp rename to pythonwin/stdafxole.cpp diff --git a/Pythonwin/stdafxole.h b/pythonwin/stdafxole.h similarity index 100% rename from Pythonwin/stdafxole.h rename to pythonwin/stdafxole.h diff --git a/Pythonwin/stdafxpw.cpp b/pythonwin/stdafxpw.cpp similarity index 100% rename from Pythonwin/stdafxpw.cpp rename to pythonwin/stdafxpw.cpp diff --git a/Pythonwin/stdafxpw.h b/pythonwin/stdafxpw.h similarity index 100% rename from Pythonwin/stdafxpw.h rename to pythonwin/stdafxpw.h diff --git a/Pythonwin/stddde.cpp b/pythonwin/stddde.cpp similarity index 100% rename from Pythonwin/stddde.cpp rename to pythonwin/stddde.cpp diff --git a/Pythonwin/win32ImageList.cpp b/pythonwin/win32ImageList.cpp similarity index 100% rename from Pythonwin/win32ImageList.cpp rename to pythonwin/win32ImageList.cpp diff --git a/Pythonwin/win32ImageList.h b/pythonwin/win32ImageList.h similarity index 100% rename from Pythonwin/win32ImageList.h rename to pythonwin/win32ImageList.h diff --git a/Pythonwin/win32RichEdit.cpp b/pythonwin/win32RichEdit.cpp similarity index 100% rename from Pythonwin/win32RichEdit.cpp rename to pythonwin/win32RichEdit.cpp diff --git a/Pythonwin/win32RichEdit.h b/pythonwin/win32RichEdit.h similarity index 100% rename from Pythonwin/win32RichEdit.h rename to pythonwin/win32RichEdit.h diff --git a/Pythonwin/win32RichEditDocTemplate.cpp b/pythonwin/win32RichEditDocTemplate.cpp similarity index 100% rename from Pythonwin/win32RichEditDocTemplate.cpp rename to pythonwin/win32RichEditDocTemplate.cpp diff --git a/Pythonwin/win32RichEditDocTemplate.h b/pythonwin/win32RichEditDocTemplate.h similarity index 100% rename from Pythonwin/win32RichEditDocTemplate.h rename to pythonwin/win32RichEditDocTemplate.h diff --git a/Pythonwin/win32app.cpp b/pythonwin/win32app.cpp similarity index 100% rename from Pythonwin/win32app.cpp rename to pythonwin/win32app.cpp diff --git a/Pythonwin/win32assoc.cpp b/pythonwin/win32assoc.cpp similarity index 100% rename from Pythonwin/win32assoc.cpp rename to pythonwin/win32assoc.cpp diff --git a/Pythonwin/win32assoc.h b/pythonwin/win32assoc.h similarity index 100% rename from Pythonwin/win32assoc.h rename to pythonwin/win32assoc.h diff --git a/Pythonwin/win32bitmap.cpp b/pythonwin/win32bitmap.cpp similarity index 100% rename from Pythonwin/win32bitmap.cpp rename to pythonwin/win32bitmap.cpp diff --git a/Pythonwin/win32bitmap.h b/pythonwin/win32bitmap.h similarity index 100% rename from Pythonwin/win32bitmap.h rename to pythonwin/win32bitmap.h diff --git a/Pythonwin/win32brush.cpp b/pythonwin/win32brush.cpp similarity index 100% rename from Pythonwin/win32brush.cpp rename to pythonwin/win32brush.cpp diff --git a/Pythonwin/win32brush.h b/pythonwin/win32brush.h similarity index 100% rename from Pythonwin/win32brush.h rename to pythonwin/win32brush.h diff --git a/Pythonwin/win32cmd.cpp b/pythonwin/win32cmd.cpp similarity index 100% rename from Pythonwin/win32cmd.cpp rename to pythonwin/win32cmd.cpp diff --git a/Pythonwin/win32cmd.h b/pythonwin/win32cmd.h similarity index 100% rename from Pythonwin/win32cmd.h rename to pythonwin/win32cmd.h diff --git a/Pythonwin/win32cmdui.cpp b/pythonwin/win32cmdui.cpp similarity index 100% rename from Pythonwin/win32cmdui.cpp rename to pythonwin/win32cmdui.cpp diff --git a/Pythonwin/win32cmdui.h b/pythonwin/win32cmdui.h similarity index 100% rename from Pythonwin/win32cmdui.h rename to pythonwin/win32cmdui.h diff --git a/Pythonwin/win32context.cpp b/pythonwin/win32context.cpp similarity index 100% rename from Pythonwin/win32context.cpp rename to pythonwin/win32context.cpp diff --git a/Pythonwin/win32control.cpp b/pythonwin/win32control.cpp similarity index 100% rename from Pythonwin/win32control.cpp rename to pythonwin/win32control.cpp diff --git a/Pythonwin/win32control.h b/pythonwin/win32control.h similarity index 100% rename from Pythonwin/win32control.h rename to pythonwin/win32control.h diff --git a/Pythonwin/win32ctledit.cpp b/pythonwin/win32ctledit.cpp similarity index 100% rename from Pythonwin/win32ctledit.cpp rename to pythonwin/win32ctledit.cpp diff --git a/Pythonwin/win32ctrlList.cpp b/pythonwin/win32ctrlList.cpp similarity index 100% rename from Pythonwin/win32ctrlList.cpp rename to pythonwin/win32ctrlList.cpp diff --git a/Pythonwin/win32ctrlList.h b/pythonwin/win32ctrlList.h similarity index 100% rename from Pythonwin/win32ctrlList.h rename to pythonwin/win32ctrlList.h diff --git a/Pythonwin/win32ctrlRichEdit.cpp b/pythonwin/win32ctrlRichEdit.cpp similarity index 100% rename from Pythonwin/win32ctrlRichEdit.cpp rename to pythonwin/win32ctrlRichEdit.cpp diff --git a/Pythonwin/win32ctrlTree.cpp b/pythonwin/win32ctrlTree.cpp similarity index 100% rename from Pythonwin/win32ctrlTree.cpp rename to pythonwin/win32ctrlTree.cpp diff --git a/Pythonwin/win32ctrlTree.h b/pythonwin/win32ctrlTree.h similarity index 100% rename from Pythonwin/win32ctrlTree.h rename to pythonwin/win32ctrlTree.h diff --git a/Pythonwin/win32dc.cpp b/pythonwin/win32dc.cpp similarity index 100% rename from Pythonwin/win32dc.cpp rename to pythonwin/win32dc.cpp diff --git a/Pythonwin/win32dc.h b/pythonwin/win32dc.h similarity index 100% rename from Pythonwin/win32dc.h rename to pythonwin/win32dc.h diff --git a/Pythonwin/win32dlg.cpp b/pythonwin/win32dlg.cpp similarity index 100% rename from Pythonwin/win32dlg.cpp rename to pythonwin/win32dlg.cpp diff --git a/Pythonwin/win32dlg.h b/pythonwin/win32dlg.h similarity index 100% rename from Pythonwin/win32dlg.h rename to pythonwin/win32dlg.h diff --git a/Pythonwin/win32dlgbar.cpp b/pythonwin/win32dlgbar.cpp similarity index 100% rename from Pythonwin/win32dlgbar.cpp rename to pythonwin/win32dlgbar.cpp diff --git a/Pythonwin/win32dlgbar.h b/pythonwin/win32dlgbar.h similarity index 100% rename from Pythonwin/win32dlgbar.h rename to pythonwin/win32dlgbar.h diff --git a/Pythonwin/win32dll.cpp b/pythonwin/win32dll.cpp similarity index 100% rename from Pythonwin/win32dll.cpp rename to pythonwin/win32dll.cpp diff --git a/Pythonwin/win32dll.h b/pythonwin/win32dll.h similarity index 100% rename from Pythonwin/win32dll.h rename to pythonwin/win32dll.h diff --git a/Pythonwin/win32doc.cpp b/pythonwin/win32doc.cpp similarity index 100% rename from Pythonwin/win32doc.cpp rename to pythonwin/win32doc.cpp diff --git a/Pythonwin/win32doc.h b/pythonwin/win32doc.h similarity index 100% rename from Pythonwin/win32doc.h rename to pythonwin/win32doc.h diff --git a/Pythonwin/win32font.cpp b/pythonwin/win32font.cpp similarity index 100% rename from Pythonwin/win32font.cpp rename to pythonwin/win32font.cpp diff --git a/Pythonwin/win32font.h b/pythonwin/win32font.h similarity index 100% rename from Pythonwin/win32font.h rename to pythonwin/win32font.h diff --git a/Pythonwin/win32gdi.cpp b/pythonwin/win32gdi.cpp similarity index 100% rename from Pythonwin/win32gdi.cpp rename to pythonwin/win32gdi.cpp diff --git a/Pythonwin/win32gdi.h b/pythonwin/win32gdi.h similarity index 100% rename from Pythonwin/win32gdi.h rename to pythonwin/win32gdi.h diff --git a/Pythonwin/win32hl.h b/pythonwin/win32hl.h similarity index 100% rename from Pythonwin/win32hl.h rename to pythonwin/win32hl.h diff --git a/Pythonwin/win32menu.cpp b/pythonwin/win32menu.cpp similarity index 100% rename from Pythonwin/win32menu.cpp rename to pythonwin/win32menu.cpp diff --git a/Pythonwin/win32menu.h b/pythonwin/win32menu.h similarity index 100% rename from Pythonwin/win32menu.h rename to pythonwin/win32menu.h diff --git a/Pythonwin/win32notify.cpp b/pythonwin/win32notify.cpp similarity index 100% rename from Pythonwin/win32notify.cpp rename to pythonwin/win32notify.cpp diff --git a/Pythonwin/win32oleDlgInsert.cpp b/pythonwin/win32oleDlgInsert.cpp similarity index 100% rename from Pythonwin/win32oleDlgInsert.cpp rename to pythonwin/win32oleDlgInsert.cpp diff --git a/Pythonwin/win32oleDlgs.cpp b/pythonwin/win32oleDlgs.cpp similarity index 100% rename from Pythonwin/win32oleDlgs.cpp rename to pythonwin/win32oleDlgs.cpp diff --git a/Pythonwin/win32oleDlgs.h b/pythonwin/win32oleDlgs.h similarity index 100% rename from Pythonwin/win32oleDlgs.h rename to pythonwin/win32oleDlgs.h diff --git a/Pythonwin/win32pen.cpp b/pythonwin/win32pen.cpp similarity index 100% rename from Pythonwin/win32pen.cpp rename to pythonwin/win32pen.cpp diff --git a/Pythonwin/win32pen.h b/pythonwin/win32pen.h similarity index 100% rename from Pythonwin/win32pen.h rename to pythonwin/win32pen.h diff --git a/Pythonwin/win32prinfo.cpp b/pythonwin/win32prinfo.cpp similarity index 100% rename from Pythonwin/win32prinfo.cpp rename to pythonwin/win32prinfo.cpp diff --git a/Pythonwin/win32prinfo.h b/pythonwin/win32prinfo.h similarity index 100% rename from Pythonwin/win32prinfo.h rename to pythonwin/win32prinfo.h diff --git a/Pythonwin/win32prop.cpp b/pythonwin/win32prop.cpp similarity index 100% rename from Pythonwin/win32prop.cpp rename to pythonwin/win32prop.cpp diff --git a/Pythonwin/win32prop.h b/pythonwin/win32prop.h similarity index 100% rename from Pythonwin/win32prop.h rename to pythonwin/win32prop.h diff --git a/Pythonwin/win32rgn.cpp b/pythonwin/win32rgn.cpp similarity index 100% rename from Pythonwin/win32rgn.cpp rename to pythonwin/win32rgn.cpp diff --git a/Pythonwin/win32rgn.h b/pythonwin/win32rgn.h similarity index 100% rename from Pythonwin/win32rgn.h rename to pythonwin/win32rgn.h diff --git a/Pythonwin/win32splitter.cpp b/pythonwin/win32splitter.cpp similarity index 100% rename from Pythonwin/win32splitter.cpp rename to pythonwin/win32splitter.cpp diff --git a/Pythonwin/win32splitter.h b/pythonwin/win32splitter.h similarity index 100% rename from Pythonwin/win32splitter.h rename to pythonwin/win32splitter.h diff --git a/Pythonwin/win32template.cpp b/pythonwin/win32template.cpp similarity index 100% rename from Pythonwin/win32template.cpp rename to pythonwin/win32template.cpp diff --git a/Pythonwin/win32template.h b/pythonwin/win32template.h similarity index 100% rename from Pythonwin/win32template.h rename to pythonwin/win32template.h diff --git a/Pythonwin/win32thread.cpp b/pythonwin/win32thread.cpp similarity index 100% rename from Pythonwin/win32thread.cpp rename to pythonwin/win32thread.cpp diff --git a/Pythonwin/win32toolbar.cpp b/pythonwin/win32toolbar.cpp similarity index 100% rename from Pythonwin/win32toolbar.cpp rename to pythonwin/win32toolbar.cpp diff --git a/Pythonwin/win32toolbar.h b/pythonwin/win32toolbar.h similarity index 100% rename from Pythonwin/win32toolbar.h rename to pythonwin/win32toolbar.h diff --git a/Pythonwin/win32tooltip.cpp b/pythonwin/win32tooltip.cpp similarity index 100% rename from Pythonwin/win32tooltip.cpp rename to pythonwin/win32tooltip.cpp diff --git a/Pythonwin/win32ui.h b/pythonwin/win32ui.h similarity index 100% rename from Pythonwin/win32ui.h rename to pythonwin/win32ui.h diff --git a/Pythonwin/win32ui.rc b/pythonwin/win32ui.rc similarity index 100% rename from Pythonwin/win32ui.rc rename to pythonwin/win32ui.rc diff --git a/Pythonwin/win32uiExt.h b/pythonwin/win32uiExt.h similarity index 100% rename from Pythonwin/win32uiExt.h rename to pythonwin/win32uiExt.h diff --git a/Pythonwin/win32uimodule.cpp b/pythonwin/win32uimodule.cpp similarity index 100% rename from Pythonwin/win32uimodule.cpp rename to pythonwin/win32uimodule.cpp diff --git a/Pythonwin/win32uiole.cpp b/pythonwin/win32uiole.cpp similarity index 100% rename from Pythonwin/win32uiole.cpp rename to pythonwin/win32uiole.cpp diff --git a/Pythonwin/win32uioleClientItem.cpp b/pythonwin/win32uioleClientItem.cpp similarity index 100% rename from Pythonwin/win32uioleClientItem.cpp rename to pythonwin/win32uioleClientItem.cpp diff --git a/Pythonwin/win32uioledoc.cpp b/pythonwin/win32uioledoc.cpp similarity index 100% rename from Pythonwin/win32uioledoc.cpp rename to pythonwin/win32uioledoc.cpp diff --git a/Pythonwin/win32uioledoc.h b/pythonwin/win32uioledoc.h similarity index 100% rename from Pythonwin/win32uioledoc.h rename to pythonwin/win32uioledoc.h diff --git a/Pythonwin/win32util.cpp b/pythonwin/win32util.cpp similarity index 100% rename from Pythonwin/win32util.cpp rename to pythonwin/win32util.cpp diff --git a/Pythonwin/win32view.cpp b/pythonwin/win32view.cpp similarity index 100% rename from Pythonwin/win32view.cpp rename to pythonwin/win32view.cpp diff --git a/Pythonwin/win32virt.cpp b/pythonwin/win32virt.cpp similarity index 100% rename from Pythonwin/win32virt.cpp rename to pythonwin/win32virt.cpp diff --git a/Pythonwin/win32win.cpp b/pythonwin/win32win.cpp similarity index 100% rename from Pythonwin/win32win.cpp rename to pythonwin/win32win.cpp diff --git a/Pythonwin/win32win.h b/pythonwin/win32win.h similarity index 100% rename from Pythonwin/win32win.h rename to pythonwin/win32win.h From 1631fcbb2143f6dfbebc43e5f6957f1bf1fb5eb1 Mon Sep 17 00:00:00 2001 From: Avasam Date: Mon, 4 May 2026 14:25:15 -0400 Subject: [PATCH 4/4] Pull adodbapi from main to reduce changes --- adodbapi/__init__.py | 1 - adodbapi/apibase.py | 1446 ++++++++++++------------ adodbapi/examples/db_print.py | 144 +-- adodbapi/examples/db_table_names.py | 42 +- adodbapi/examples/xls_read.py | 82 +- adodbapi/examples/xls_write.py | 82 +- adodbapi/is64bit.py | 68 +- adodbapi/process_connect_string.py | 274 ++--- adodbapi/readme.txt | 176 +-- adodbapi/schema_table.py | 32 +- adodbapi/test/is64bit.py | 68 +- adodbapi/test/setuptestframework.py | 196 ++-- adodbapi/test/test_adodbapi_dbapi20.py | 380 +++---- 13 files changed, 1495 insertions(+), 1496 deletions(-) diff --git a/adodbapi/__init__.py b/adodbapi/__init__.py index 6ab125fe39..ccc63af8ef 100644 --- a/adodbapi/__init__.py +++ b/adodbapi/__init__.py @@ -1,4 +1,3 @@ -# nopycln: file # undecidable cases due to explicit re-exports https://github.com/hadialqattan/pycln/issues/205 """adodbapi - A python DB API 2.0 (PEP 249) interface to Microsoft ADO Copyright (C) 2002 Henrik Ekelund, version 2.1 by Vernon Cole diff --git a/adodbapi/apibase.py b/adodbapi/apibase.py index 2b4641940e..87a5317eb8 100644 --- a/adodbapi/apibase.py +++ b/adodbapi/apibase.py @@ -1,723 +1,723 @@ -"""adodbapi.apibase - A python DB API 2.0 (PEP 249) interface to Microsoft ADO - -Copyright (C) 2002 Henrik Ekelund, version 2.1 by Vernon Cole -* https://sourceforge.net/projects/pywin32 -* https://sourceforge.net/projects/adodbapi -""" - -from __future__ import annotations - -import datetime -import decimal -import numbers -import sys -import time -from collections.abc import Callable, Iterable, Mapping - -# noinspection PyUnresolvedReferences -from . import ado_consts as adc - -verbose = False # debugging flag - - -# ------- Error handlers ------ -def standardErrorHandler(connection, cursor, errorclass, errorvalue): - err = (errorclass, errorvalue) - try: - connection.messages.append(err) - except: - pass - if cursor is not None: - try: - cursor.messages.append(err) - except: - pass - raise errorclass(errorvalue) - - -class Error(Exception): - pass # Exception that is the base class of all other error - # exceptions. You can use this to catch all errors with one - # single 'except' statement. Warnings are not considered - # errors and thus should not use this class as base. It must - # be a subclass of the Python StandardError (defined in the - # module exceptions). - - -class Warning(Exception): - pass - - -class InterfaceError(Error): - pass - - -class DatabaseError(Error): - pass - - -class InternalError(DatabaseError): - pass - - -class OperationalError(DatabaseError): - pass - - -class ProgrammingError(DatabaseError): - pass - - -class IntegrityError(DatabaseError): - pass - - -class DataError(DatabaseError): - pass - - -class NotSupportedError(DatabaseError): - pass - - -class FetchFailedError(OperationalError): - """ - Error is used by RawStoredProcedureQuerySet to determine when a fetch - failed due to a connection being closed or there is no record set - returned. (Non-standard, added especially for django) - """ - - pass - - -# # # # # ----- Type Objects and Constructors ----- # # # # # -# Many databases need to have the input in a particular format for binding to an operation's input parameters. -# For example, if an input is destined for a DATE column, then it must be bound to the database in a particular -# string format. Similar problems exist for "Row ID" columns or large binary items (e.g. blobs or RAW columns). -# This presents problems for Python since the parameters to the executeXXX() method are untyped. -# When the database module sees a Python string object, it doesn't know if it should be bound as a simple CHAR -# column, as a raw BINARY item, or as a DATE. -# -# To overcome this problem, a module must provide the constructors defined below to create objects that can -# hold special values. When passed to the cursor methods, the module can then detect the proper type of -# the input parameter and bind it accordingly. - -# A Cursor Object's description attribute returns information about each of the result columns of a query. -# The type_code must compare equal to one of Type Objects defined below. Type Objects may be equal to more than -# one type code (e.g. DATETIME could be equal to the type codes for date, time and timestamp columns; -# see the Implementation Hints below for details). - -# SQL NULL values are represented by the Python None singleton on input and output. - -# Note: Usage of Unix ticks for database interfacing can cause troubles because of the limited date range they cover. - - -# def Date(year,month,day): -# "This function constructs an object holding a date value. " -# return dateconverter.date(year,month,day) #dateconverter.Date(year,month,day) -# -# def Time(hour,minute,second): -# "This function constructs an object holding a time value. " -# return dateconverter.time(hour, minute, second) # dateconverter.Time(hour,minute,second) -# -# def Timestamp(year,month,day,hour,minute,second): -# "This function constructs an object holding a time stamp value. " -# return dateconverter.datetime(year,month,day,hour,minute,second) -# -# def DateFromTicks(ticks): -# """This function constructs an object holding a date value from the given ticks value -# (number of seconds since the epoch; see the documentation of the standard Python time module for details). """ -# return Date(*time.gmtime(ticks)[:3]) -# -# def TimeFromTicks(ticks): -# """This function constructs an object holding a time value from the given ticks value -# (number of seconds since the epoch; see the documentation of the standard Python time module for details). """ -# return Time(*time.gmtime(ticks)[3:6]) -# -# def TimestampFromTicks(ticks): -# """This function constructs an object holding a time stamp value from the given -# ticks value (number of seconds since the epoch; -# see the documentation of the standard Python time module for details). """ -# return Timestamp(*time.gmtime(ticks)[:6]) -# -# def Binary(aString): -# """This function constructs an object capable of holding a binary (long) string value. """ -# b = bytes(aString) -# return b -# ----- Time converters ---------------------------------------------- -class TimeConverter: # this is a generic time converter skeleton - def __init__(self): # the details will be filled in by instances - self._ordinal_1899_12_31 = datetime.date(1899, 12, 31).toordinal() - 1 - # Use cls.types to compare if an input parameter is a datetime - self.types = { - # Dynamically get the types as the methods may be overriden - type(self.Date(2000, 1, 1)), - type(self.Time(12, 1, 1)), - type(self.Timestamp(2000, 1, 1, 12, 1, 1)), - datetime.datetime, - datetime.time, - datetime.date, - } - - def COMDate(self, obj): - """Returns a ComDate from a date-time""" - try: # most likely a datetime - tt = obj.timetuple() - - try: - ms = obj.microsecond - except: - ms = 0 - return self.ComDateFromTuple(tt, ms) - except: # might be a tuple - try: - return self.ComDateFromTuple(obj) - except: - raise ValueError(f'Cannot convert "{obj!r}" to COMdate.') - - def ComDateFromTuple(self, t, microseconds=0): - d = datetime.date(t[0], t[1], t[2]) - integerPart = d.toordinal() - self._ordinal_1899_12_31 - ms = (t[3] * 3600 + t[4] * 60 + t[5]) * 1000000 + microseconds - fractPart = float(ms) / 86400000000.0 - return integerPart + fractPart - - def DateObjectFromCOMDate(self, comDate): - "Returns an object of the wanted type from a ComDate" - raise NotImplementedError # "Abstract class" - - def Date(self, year, month, day): - "This function constructs an object holding a date value." - raise NotImplementedError # "Abstract class" - - def Time(self, hour, minute, second): - "This function constructs an object holding a time value." - raise NotImplementedError # "Abstract class" - - def Timestamp(self, year, month, day, hour, minute, second): - "This function constructs an object holding a time stamp value." - raise NotImplementedError # "Abstract class" - # all purpose date to ISO format converter - - def DateObjectToIsoFormatString(self, obj): - "This function should return a string in the format 'YYYY-MM-dd HH:MM:SS:ms' (ms optional)" - try: # most likely, a datetime.datetime - s = obj.isoformat(" ") - except (TypeError, AttributeError): - if isinstance(obj, datetime.date): - s = obj.isoformat() + " 00:00:00" # return exact midnight - else: - try: # but may be time.struct_time - s = time.strftime("%Y-%m-%d %H:%M:%S", obj) - except: - raise ValueError(f'Cannot convert "{obj!r}" to isoformat') - return s - - -class pythonDateTimeConverter(TimeConverter): # standard since Python 2.3 - def __init__(self): - TimeConverter.__init__(self) - - def DateObjectFromCOMDate(self, comDate): - if isinstance(comDate, datetime.datetime): - odn = comDate.toordinal() - tim = comDate.time() - new = datetime.datetime.combine(datetime.datetime.fromordinal(odn), tim) - return new - # return comDate.replace(tzinfo=None) # make non aware - else: - fComDate = float(comDate) # ComDate is number of days since 1899-12-31 - integerPart = int(fComDate) - floatpart = fComDate - integerPart - ##if floatpart == 0.0: - ## return datetime.date.fromordinal(integerPart + self._ordinal_1899_12_31) - dte = datetime.datetime.fromordinal( - integerPart + self._ordinal_1899_12_31 - ) + datetime.timedelta(milliseconds=floatpart * 86400000) - # millisecondsperday=86400000 # 24*60*60*1000 - return dte - - def Date(self, year, month, day): - return datetime.date(year, month, day) - - def Time(self, hour, minute, second): - return datetime.time(hour, minute, second) - - def Timestamp(self, year, month, day, hour, minute, second): - return datetime.datetime(year, month, day, hour, minute, second) - - -class pythonTimeConverter(TimeConverter): # the old, ?nix type date and time - def __init__(self): # caution: this Class gets confused by timezones and DST - TimeConverter.__init__(self) - self.types.add(time.struct_time) - - def DateObjectFromCOMDate(self, comDate): - "Returns ticks since 1970" - if isinstance(comDate, datetime.datetime): - return comDate.timetuple() - else: - fcomDate = float(comDate) - secondsperday = 86400 # 24*60*60 - # ComDate is number of days since 1899-12-31, gmtime epoch is 1970-1-1 = 25569 days - t = time.gmtime(secondsperday * (fcomDate - 25569.0)) - return t # year,month,day,hour,minute,second,weekday,julianday,daylightsaving=t - - def Date(self, year, month, day): - return self.Timestamp(year, month, day, 0, 0, 0) - - def Time(self, hour, minute, second): - return time.gmtime((hour * 60 + minute) * 60 + second) - - def Timestamp(self, year, month, day, hour, minute, second): - return time.localtime( - time.mktime((year, month, day, hour, minute, second, 0, 0, -1)) - ) - - -base_dateconverter = pythonDateTimeConverter() - -# ------ DB API required module attributes --------------------- -threadsafety = 1 # TODO -- find out whether this module is actually BETTER than 1. - -apilevel = "2.0" # String constant stating the supported DB API level. - -paramstyle = "qmark" # the default parameter style - -# ------ control for an extension which may become part of DB API 3.0 --- -accepted_paramstyles = ("qmark", "named", "format", "pyformat", "dynamic") - -# ------------------------------------------------------------------------------------------ -# define similar types for generic conversion routines -adoIntegerTypes = ( - adc.adInteger, - adc.adSmallInt, - adc.adTinyInt, - adc.adUnsignedInt, - adc.adUnsignedSmallInt, - adc.adUnsignedTinyInt, - adc.adBoolean, - adc.adError, -) # max 32 bits -adoRowIdTypes = (adc.adChapter,) # v2.1 Rose -adoLongTypes = (adc.adBigInt, adc.adFileTime, adc.adUnsignedBigInt) -adoExactNumericTypes = ( - adc.adDecimal, - adc.adNumeric, - adc.adVarNumeric, - adc.adCurrency, -) # v2.3 Cole -adoApproximateNumericTypes = (adc.adDouble, adc.adSingle) # v2.1 Cole -adoStringTypes = ( - adc.adBSTR, - adc.adChar, - adc.adLongVarChar, - adc.adLongVarWChar, - adc.adVarChar, - adc.adVarWChar, - adc.adWChar, -) -adoBinaryTypes = (adc.adBinary, adc.adLongVarBinary, adc.adVarBinary) -adoDateTimeTypes = (adc.adDBTime, adc.adDBTimeStamp, adc.adDate, adc.adDBDate) -adoRemainingTypes = ( - adc.adEmpty, - adc.adIDispatch, - adc.adIUnknown, - adc.adPropVariant, - adc.adArray, - adc.adUserDefined, - adc.adVariant, - adc.adGUID, -) - - -# this class is a trick to determine whether a type is a member of a related group of types. see PEP notes -class DBAPITypeObject: - def __init__(self, valuesTuple): - self.values = frozenset(valuesTuple) - - def __eq__(self, other): - return other in self.values - - def __ne__(self, other): - return other not in self.values - - -"""This type object is used to describe columns in a database that are string-based (e.g. CHAR). """ -STRING = DBAPITypeObject(adoStringTypes) - -"""This type object is used to describe (long) binary columns in a database (e.g. LONG, RAW, BLOBs). """ -BINARY = DBAPITypeObject(adoBinaryTypes) - -"""This type object is used to describe numeric columns in a database. """ -NUMBER = DBAPITypeObject( - adoIntegerTypes + adoLongTypes + adoExactNumericTypes + adoApproximateNumericTypes -) - -"""This type object is used to describe date/time columns in a database. """ - -DATETIME = DBAPITypeObject(adoDateTimeTypes) -"""This type object is used to describe the "Row ID" column in a database. """ -ROWID = DBAPITypeObject(adoRowIdTypes) - -OTHER = DBAPITypeObject(adoRemainingTypes) - -# ------- utilities for translating python data types to ADO data types --------------------------------- -typeMap = { - memoryview: adc.adVarBinary, - float: adc.adDouble, - type(None): adc.adEmpty, - str: adc.adBSTR, - bool: adc.adBoolean, # v2.1 Cole - decimal.Decimal: adc.adDecimal, - int: adc.adBigInt, - bytes: adc.adVarBinary, -} - - -def pyTypeToADOType(d): - tp = type(d) - try: - return typeMap[tp] - except KeyError: # The type was not defined in the pre-computed Type table - from . import dateconverter - - # maybe it is one of our supported Date/Time types - if tp in dateconverter.types: - return adc.adDate - # otherwise, attempt to discern the type by probing the data object itself -- to handle duck typing - if isinstance(d, str): - return adc.adBSTR - if isinstance(d, numbers.Integral): - return adc.adBigInt - if isinstance(d, numbers.Real): - return adc.adDouble - raise DataError(f'cannot convert "{d!r}" (type={tp}) to ADO') - - -# # # # # # # # # # # # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# functions to convert database values to Python objects -# ------------------------------------------------------------------------ -# variant type : function converting variant to Python value -def variantConvertDate(v): - from . import dateconverter # this function only called when adodbapi is running - - return dateconverter.DateObjectFromCOMDate(v) - - -def cvtString(variant): # use to get old action of adodbapi v1 if desired - return str(variant) - - -def cvtDecimal(variant): # better name - return _convertNumberWithCulture(variant, decimal.Decimal) - - -def cvtNumeric(variant): # older name - don't break old code - return cvtDecimal(variant) - - -def cvtFloat(variant): - return _convertNumberWithCulture(variant, float) - - -def _convertNumberWithCulture(variant, f): - try: - return f(variant) - except (ValueError, TypeError, decimal.InvalidOperation): - try: - europeVsUS = str(variant).replace(",", ".") - return f(europeVsUS) - except (ValueError, TypeError, decimal.InvalidOperation): - pass - - -def cvtInt(variant): - return int(variant) - - -def cvtLong(variant): # only important in old versions where long and int differ - return int(variant) - - -def cvtBuffer(variant): - return bytes(variant) - - -def cvtUnicode(variant): - return str(variant) - - -def identity(x): - return x - - -def cvtUnusual(variant): - if verbose > 1: - sys.stderr.write(f"Conversion called for Unusual data={variant!r}\n") - return variant # cannot find conversion function -- just give the data to the user - - -def convert_to_python(variant, func): # convert DB value into Python value - if variant is None: - return None - return func(variant) # call the appropriate conversion function - - -class MultiMap(dict[int, Callable[[object], object]]): - # builds a dictionary from {(iterable,of,keys) : function} - """A dictionary of ado.type : function - -- but you can set multiple items by passing an iterable of keys""" - - # useful for defining conversion functions for groups of similar data types. - def __init__(self, aDict: Mapping[Iterable[int] | int, Callable[[object], object]]): - for k, v in aDict.items(): - self[k] = v # we must call __setitem__ - - def __setitem__( - self, adoType: Iterable[int] | int, cvtFn: Callable[[object], object] - ): - "set a single item, or a whole iterable of items" - if isinstance(adoType, Iterable): - # user passed us an iterable, set them individually - for type in adoType: - dict.__setitem__(self, type, cvtFn) - else: - dict.__setitem__(self, adoType, cvtFn) - - -# initialize variantConversions dictionary used to convert SQL to Python -# this is the dictionary of default conversion functions, built by the class above. -# this becomes a class attribute for the Connection, and that attribute is used -# to build the list of column conversion functions for the Cursor -variantConversions = MultiMap( - { - adoDateTimeTypes: variantConvertDate, - adoApproximateNumericTypes: cvtFloat, - adoExactNumericTypes: cvtDecimal, # use to force decimal rather than unicode - adoLongTypes: cvtLong, - adoIntegerTypes: cvtInt, - adoRowIdTypes: cvtInt, - adoStringTypes: identity, - adoBinaryTypes: cvtBuffer, - adoRemainingTypes: cvtUnusual, - } -) - -# # # # # classes to emulate the result of cursor.fetchxxx() as a sequence of sequences # # # # # -# "an ENUM of how my low level records are laid out" -RS_WIN_32, RS_ARRAY, RS_REMOTE = list(range(1, 4)) - - -class SQLrow: # a single database row - # class to emulate a sequence, so that a column may be retrieved by either number or name - def __init__(self, rows, index): # "rows" is an _SQLrows object, index is which row - self.rows = rows # parent 'fetch' container object - self.index = index # my row number within parent - - def __getattr__(self, name): # used for row.columnName type of value access - try: - return self._getValue(self.rows.columnNames[name.lower()]) - except KeyError: - raise AttributeError('Unknown column name "{}"'.format(name)) - - def _getValue(self, key): # key must be an integer - if ( - self.rows.recordset_format == RS_ARRAY - ): # retrieve from two-dimensional array - v = self.rows.ado_results[key, self.index] - elif self.rows.recordset_format == RS_REMOTE: - v = self.rows.ado_results[self.index][key] - else: # pywin32 - retrieve from tuple of tuples - v = self.rows.ado_results[key][self.index] - if self.rows.converters is NotImplemented: - return v - return convert_to_python(v, self.rows.converters[key]) - - def __len__(self): - return self.rows.numberOfColumns - - def __getitem__(self, key): # used for row[key] type of value access - if isinstance(key, int): # normal row[1] designation - try: - return self._getValue(key) - except IndexError: - raise - if isinstance(key, slice): - indices = key.indices(self.rows.numberOfColumns) - vl = [self._getValue(i) for i in range(*indices)] - return tuple(vl) - try: - return self._getValue( - self.rows.columnNames[key.lower()] - ) # extension row[columnName] designation - except (KeyError, TypeError): - er, st, tr = sys.exc_info() - raise er(f'No such key as "{key!r}" in {self!r}').with_traceback(tr) - - def __iter__(self): - return iter(self.__next__()) - - def __next__(self): - for n in range(self.rows.numberOfColumns): - yield self._getValue(n) - - def __repr__(self): # create a human readable representation - taglist = sorted(list(self.rows.columnNames.items()), key=lambda x: x[1]) - s = "" - - def __str__(self): # create a pretty human readable representation - return str( - tuple(str(self._getValue(i)) for i in range(self.rows.numberOfColumns)) - ) - - # TO-DO implement pickling an SQLrow directly - # def __getstate__(self): return self.__dict__ - # def __setstate__(self, d): self.__dict__.update(d) - # which basically tell pickle to treat your class just like a normal one, - # taking self.__dict__ as representing the whole of the instance state, - # despite the existence of the __getattr__. - # # # # - - -class SQLrows: - # class to emulate a sequence for multiple rows using a container object - def __init__(self, ado_results, numberOfRows, cursor): - self.ado_results = ado_results # raw result of SQL get - try: - self.recordset_format = cursor.recordset_format - self.numberOfColumns = cursor.numberOfColumns - self.converters = cursor.converters - self.columnNames = cursor.columnNames - except AttributeError: - self.recordset_format = RS_ARRAY - self.numberOfColumns = 0 - self.converters = [] - self.columnNames = {} - self.numberOfRows = numberOfRows - - def __len__(self): - return self.numberOfRows - - def __getitem__(self, item): # used for row or row,column access - if not self.ado_results: - return [] - if isinstance(item, slice): # will return a list of row objects - indices = item.indices(self.numberOfRows) - return [SQLrow(self, k) for k in range(*indices)] - elif isinstance(item, tuple) and len(item) == 2: - # d = some_rowsObject[i,j] will return a datum from a two-dimension address - i, j = item - if not isinstance(j, int): - try: - j = self.columnNames[j.lower()] # convert named column to numeric - except KeyError: - raise KeyError(f"adodbapi: no such column name as {j!r}") - if self.recordset_format == RS_ARRAY: # retrieve from two-dimensional array - v = self.ado_results[j, i] - elif self.recordset_format == RS_REMOTE: - v = self.ado_results[i][j] - else: # pywin32 - retrieve from tuple of tuples - v = self.ado_results[j][i] - if self.converters is NotImplemented: - return v - return convert_to_python(v, self.converters[j]) - else: - row = SQLrow(self, item) # new row descriptor - return row - - def __iter__(self): - return iter(self.__next__()) - - def __next__(self): - for n in range(self.numberOfRows): - row = SQLrow(self, n) - yield row - # # # # # - - # # # # # functions to re-format SQL requests to other paramstyle requirements # # # # # # # # # # - - -def changeNamedToQmark( - op, -): # convert from 'named' paramstyle to ADO required '?'mark parameters - outOp = "" - outparms = [] - chunks = op.split( - "'" - ) # quote all literals -- odd numbered list results are literals. - inQuotes = False - for chunk in chunks: - if inQuotes: # this is inside a quote - if chunk == "": # double apostrophe to quote one apostrophe - outOp = outOp[:-1] # so take one away - else: - outOp += "'" + chunk + "'" # else pass the quoted string as is. - else: # is SQL code -- look for a :namedParameter - while chunk: # some SQL string remains - sp = chunk.split(":", 1) - outOp += sp[0] # concat the part up to the : - s = "" - try: - chunk = sp[1] - except IndexError: - chunk = None - if chunk: # there was a parameter - parse it out - i = 0 - c = chunk[0] - while c.isalnum() or c == "_": - i += 1 - try: - c = chunk[i] - except IndexError: - break - s = chunk[:i] - chunk = chunk[i:] - if s: - outparms.append(s) # list the parameters in order - outOp += "?" # put in the Qmark - inQuotes = not inQuotes - return outOp, outparms - - -def changeFormatToQmark( - op, -): # convert from 'format' paramstyle to ADO required '?'mark parameters - outOp = "" - outparams = [] - chunks = op.split( - "'" - ) # quote all literals -- odd numbered list results are literals. - inQuotes = False - for chunk in chunks: - if inQuotes: - if ( - outOp != "" and chunk == "" - ): # he used a double apostrophe to quote one apostrophe - outOp = outOp[:-1] # so take one away - else: - outOp += "'" + chunk + "'" # else pass the quoted string as is. - else: # is SQL code -- look for a %s parameter - if "%(" in chunk: # ugh! pyformat! - while chunk: # some SQL string remains - sp = chunk.split("%(", 1) - outOp += sp[0] # concat the part up to the % - if len(sp) > 1: - try: - s, chunk = sp[1].split(")s", 1) # find the ')s' - except ValueError: - raise ProgrammingError( - 'Pyformat SQL has incorrect format near "%s"' % chunk - ) - outparams.append(s) - outOp += "?" # put in the Qmark - else: - chunk = None - else: # proper '%s' format - sp = chunk.split("%s") # make each %s - outOp += "?".join(sp) # into ? - inQuotes = not inQuotes # every other chunk is a quoted string - return outOp, outparams +"""adodbapi.apibase - A python DB API 2.0 (PEP 249) interface to Microsoft ADO + +Copyright (C) 2002 Henrik Ekelund, version 2.1 by Vernon Cole +* https://sourceforge.net/projects/pywin32 +* https://sourceforge.net/projects/adodbapi +""" + +from __future__ import annotations + +import datetime +import decimal +import numbers +import sys +import time +from collections.abc import Callable, Iterable, Mapping + +# noinspection PyUnresolvedReferences +from . import ado_consts as adc + +verbose = False # debugging flag + + +# ------- Error handlers ------ +def standardErrorHandler(connection, cursor, errorclass, errorvalue): + err = (errorclass, errorvalue) + try: + connection.messages.append(err) + except: + pass + if cursor is not None: + try: + cursor.messages.append(err) + except: + pass + raise errorclass(errorvalue) + + +class Error(Exception): + pass # Exception that is the base class of all other error + # exceptions. You can use this to catch all errors with one + # single 'except' statement. Warnings are not considered + # errors and thus should not use this class as base. It must + # be a subclass of the Python StandardError (defined in the + # module exceptions). + + +class Warning(Exception): + pass + + +class InterfaceError(Error): + pass + + +class DatabaseError(Error): + pass + + +class InternalError(DatabaseError): + pass + + +class OperationalError(DatabaseError): + pass + + +class ProgrammingError(DatabaseError): + pass + + +class IntegrityError(DatabaseError): + pass + + +class DataError(DatabaseError): + pass + + +class NotSupportedError(DatabaseError): + pass + + +class FetchFailedError(OperationalError): + """ + Error is used by RawStoredProcedureQuerySet to determine when a fetch + failed due to a connection being closed or there is no record set + returned. (Non-standard, added especially for django) + """ + + pass + + +# # # # # ----- Type Objects and Constructors ----- # # # # # +# Many databases need to have the input in a particular format for binding to an operation's input parameters. +# For example, if an input is destined for a DATE column, then it must be bound to the database in a particular +# string format. Similar problems exist for "Row ID" columns or large binary items (e.g. blobs or RAW columns). +# This presents problems for Python since the parameters to the executeXXX() method are untyped. +# When the database module sees a Python string object, it doesn't know if it should be bound as a simple CHAR +# column, as a raw BINARY item, or as a DATE. +# +# To overcome this problem, a module must provide the constructors defined below to create objects that can +# hold special values. When passed to the cursor methods, the module can then detect the proper type of +# the input parameter and bind it accordingly. + +# A Cursor Object's description attribute returns information about each of the result columns of a query. +# The type_code must compare equal to one of Type Objects defined below. Type Objects may be equal to more than +# one type code (e.g. DATETIME could be equal to the type codes for date, time and timestamp columns; +# see the Implementation Hints below for details). + +# SQL NULL values are represented by the Python None singleton on input and output. + +# Note: Usage of Unix ticks for database interfacing can cause troubles because of the limited date range they cover. + + +# def Date(year,month,day): +# "This function constructs an object holding a date value. " +# return dateconverter.date(year,month,day) #dateconverter.Date(year,month,day) +# +# def Time(hour,minute,second): +# "This function constructs an object holding a time value. " +# return dateconverter.time(hour, minute, second) # dateconverter.Time(hour,minute,second) +# +# def Timestamp(year,month,day,hour,minute,second): +# "This function constructs an object holding a time stamp value. " +# return dateconverter.datetime(year,month,day,hour,minute,second) +# +# def DateFromTicks(ticks): +# """This function constructs an object holding a date value from the given ticks value +# (number of seconds since the epoch; see the documentation of the standard Python time module for details). """ +# return Date(*time.gmtime(ticks)[:3]) +# +# def TimeFromTicks(ticks): +# """This function constructs an object holding a time value from the given ticks value +# (number of seconds since the epoch; see the documentation of the standard Python time module for details). """ +# return Time(*time.gmtime(ticks)[3:6]) +# +# def TimestampFromTicks(ticks): +# """This function constructs an object holding a time stamp value from the given +# ticks value (number of seconds since the epoch; +# see the documentation of the standard Python time module for details). """ +# return Timestamp(*time.gmtime(ticks)[:6]) +# +# def Binary(aString): +# """This function constructs an object capable of holding a binary (long) string value. """ +# b = bytes(aString) +# return b +# ----- Time converters ---------------------------------------------- +class TimeConverter: # this is a generic time converter skeleton + def __init__(self): # the details will be filled in by instances + self._ordinal_1899_12_31 = datetime.date(1899, 12, 31).toordinal() - 1 + # Use cls.types to compare if an input parameter is a datetime + self.types = { + # Dynamically get the types as the methods may be overriden + type(self.Date(2000, 1, 1)), + type(self.Time(12, 1, 1)), + type(self.Timestamp(2000, 1, 1, 12, 1, 1)), + datetime.datetime, + datetime.time, + datetime.date, + } + + def COMDate(self, obj): + """Returns a ComDate from a date-time""" + try: # most likely a datetime + tt = obj.timetuple() + + try: + ms = obj.microsecond + except: + ms = 0 + return self.ComDateFromTuple(tt, ms) + except: # might be a tuple + try: + return self.ComDateFromTuple(obj) + except: + raise ValueError(f'Cannot convert "{obj!r}" to COMdate.') + + def ComDateFromTuple(self, t, microseconds=0): + d = datetime.date(t[0], t[1], t[2]) + integerPart = d.toordinal() - self._ordinal_1899_12_31 + ms = (t[3] * 3600 + t[4] * 60 + t[5]) * 1000000 + microseconds + fractPart = float(ms) / 86400000000.0 + return integerPart + fractPart + + def DateObjectFromCOMDate(self, comDate): + "Returns an object of the wanted type from a ComDate" + raise NotImplementedError # "Abstract class" + + def Date(self, year, month, day): + "This function constructs an object holding a date value." + raise NotImplementedError # "Abstract class" + + def Time(self, hour, minute, second): + "This function constructs an object holding a time value." + raise NotImplementedError # "Abstract class" + + def Timestamp(self, year, month, day, hour, minute, second): + "This function constructs an object holding a time stamp value." + raise NotImplementedError # "Abstract class" + # all purpose date to ISO format converter + + def DateObjectToIsoFormatString(self, obj): + "This function should return a string in the format 'YYYY-MM-dd HH:MM:SS:ms' (ms optional)" + try: # most likely, a datetime.datetime + s = obj.isoformat(" ") + except (TypeError, AttributeError): + if isinstance(obj, datetime.date): + s = obj.isoformat() + " 00:00:00" # return exact midnight + else: + try: # but may be time.struct_time + s = time.strftime("%Y-%m-%d %H:%M:%S", obj) + except: + raise ValueError(f'Cannot convert "{obj!r}" to isoformat') + return s + + +class pythonDateTimeConverter(TimeConverter): # standard since Python 2.3 + def __init__(self): + TimeConverter.__init__(self) + + def DateObjectFromCOMDate(self, comDate): + if isinstance(comDate, datetime.datetime): + odn = comDate.toordinal() + tim = comDate.time() + new = datetime.datetime.combine(datetime.datetime.fromordinal(odn), tim) + return new + # return comDate.replace(tzinfo=None) # make non aware + else: + fComDate = float(comDate) # ComDate is number of days since 1899-12-31 + integerPart = int(fComDate) + floatpart = fComDate - integerPart + ##if floatpart == 0.0: + ## return datetime.date.fromordinal(integerPart + self._ordinal_1899_12_31) + dte = datetime.datetime.fromordinal( + integerPart + self._ordinal_1899_12_31 + ) + datetime.timedelta(milliseconds=floatpart * 86400000) + # millisecondsperday=86400000 # 24*60*60*1000 + return dte + + def Date(self, year, month, day): + return datetime.date(year, month, day) + + def Time(self, hour, minute, second): + return datetime.time(hour, minute, second) + + def Timestamp(self, year, month, day, hour, minute, second): + return datetime.datetime(year, month, day, hour, minute, second) + + +class pythonTimeConverter(TimeConverter): # the old, ?nix type date and time + def __init__(self): # caution: this Class gets confused by timezones and DST + TimeConverter.__init__(self) + self.types.add(time.struct_time) + + def DateObjectFromCOMDate(self, comDate): + "Returns ticks since 1970" + if isinstance(comDate, datetime.datetime): + return comDate.timetuple() + else: + fcomDate = float(comDate) + secondsperday = 86400 # 24*60*60 + # ComDate is number of days since 1899-12-31, gmtime epoch is 1970-1-1 = 25569 days + t = time.gmtime(secondsperday * (fcomDate - 25569.0)) + return t # year,month,day,hour,minute,second,weekday,julianday,daylightsaving=t + + def Date(self, year, month, day): + return self.Timestamp(year, month, day, 0, 0, 0) + + def Time(self, hour, minute, second): + return time.gmtime((hour * 60 + minute) * 60 + second) + + def Timestamp(self, year, month, day, hour, minute, second): + return time.localtime( + time.mktime((year, month, day, hour, minute, second, 0, 0, -1)) + ) + + +base_dateconverter = pythonDateTimeConverter() + +# ------ DB API required module attributes --------------------- +threadsafety = 1 # TODO -- find out whether this module is actually BETTER than 1. + +apilevel = "2.0" # String constant stating the supported DB API level. + +paramstyle = "qmark" # the default parameter style + +# ------ control for an extension which may become part of DB API 3.0 --- +accepted_paramstyles = ("qmark", "named", "format", "pyformat", "dynamic") + +# ------------------------------------------------------------------------------------------ +# define similar types for generic conversion routines +adoIntegerTypes = ( + adc.adInteger, + adc.adSmallInt, + adc.adTinyInt, + adc.adUnsignedInt, + adc.adUnsignedSmallInt, + adc.adUnsignedTinyInt, + adc.adBoolean, + adc.adError, +) # max 32 bits +adoRowIdTypes = (adc.adChapter,) # v2.1 Rose +adoLongTypes = (adc.adBigInt, adc.adFileTime, adc.adUnsignedBigInt) +adoExactNumericTypes = ( + adc.adDecimal, + adc.adNumeric, + adc.adVarNumeric, + adc.adCurrency, +) # v2.3 Cole +adoApproximateNumericTypes = (adc.adDouble, adc.adSingle) # v2.1 Cole +adoStringTypes = ( + adc.adBSTR, + adc.adChar, + adc.adLongVarChar, + adc.adLongVarWChar, + adc.adVarChar, + adc.adVarWChar, + adc.adWChar, +) +adoBinaryTypes = (adc.adBinary, adc.adLongVarBinary, adc.adVarBinary) +adoDateTimeTypes = (adc.adDBTime, adc.adDBTimeStamp, adc.adDate, adc.adDBDate) +adoRemainingTypes = ( + adc.adEmpty, + adc.adIDispatch, + adc.adIUnknown, + adc.adPropVariant, + adc.adArray, + adc.adUserDefined, + adc.adVariant, + adc.adGUID, +) + + +# this class is a trick to determine whether a type is a member of a related group of types. see PEP notes +class DBAPITypeObject: + def __init__(self, valuesTuple): + self.values = frozenset(valuesTuple) + + def __eq__(self, other): + return other in self.values + + def __ne__(self, other): + return other not in self.values + + +"""This type object is used to describe columns in a database that are string-based (e.g. CHAR). """ +STRING = DBAPITypeObject(adoStringTypes) + +"""This type object is used to describe (long) binary columns in a database (e.g. LONG, RAW, BLOBs). """ +BINARY = DBAPITypeObject(adoBinaryTypes) + +"""This type object is used to describe numeric columns in a database. """ +NUMBER = DBAPITypeObject( + adoIntegerTypes + adoLongTypes + adoExactNumericTypes + adoApproximateNumericTypes +) + +"""This type object is used to describe date/time columns in a database. """ + +DATETIME = DBAPITypeObject(adoDateTimeTypes) +"""This type object is used to describe the "Row ID" column in a database. """ +ROWID = DBAPITypeObject(adoRowIdTypes) + +OTHER = DBAPITypeObject(adoRemainingTypes) + +# ------- utilities for translating python data types to ADO data types --------------------------------- +typeMap = { + memoryview: adc.adVarBinary, + float: adc.adDouble, + type(None): adc.adEmpty, + str: adc.adBSTR, + bool: adc.adBoolean, # v2.1 Cole + decimal.Decimal: adc.adDecimal, + int: adc.adBigInt, + bytes: adc.adVarBinary, +} + + +def pyTypeToADOType(d): + tp = type(d) + try: + return typeMap[tp] + except KeyError: # The type was not defined in the pre-computed Type table + from . import dateconverter + + # maybe it is one of our supported Date/Time types + if tp in dateconverter.types: + return adc.adDate + # otherwise, attempt to discern the type by probing the data object itself -- to handle duck typing + if isinstance(d, str): + return adc.adBSTR + if isinstance(d, numbers.Integral): + return adc.adBigInt + if isinstance(d, numbers.Real): + return adc.adDouble + raise DataError(f'cannot convert "{d!r}" (type={tp}) to ADO') + + +# # # # # # # # # # # # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# functions to convert database values to Python objects +# ------------------------------------------------------------------------ +# variant type : function converting variant to Python value +def variantConvertDate(v): + from . import dateconverter # this function only called when adodbapi is running + + return dateconverter.DateObjectFromCOMDate(v) + + +def cvtString(variant): # use to get old action of adodbapi v1 if desired + return str(variant) + + +def cvtDecimal(variant): # better name + return _convertNumberWithCulture(variant, decimal.Decimal) + + +def cvtNumeric(variant): # older name - don't break old code + return cvtDecimal(variant) + + +def cvtFloat(variant): + return _convertNumberWithCulture(variant, float) + + +def _convertNumberWithCulture(variant, f): + try: + return f(variant) + except (ValueError, TypeError, decimal.InvalidOperation): + try: + europeVsUS = str(variant).replace(",", ".") + return f(europeVsUS) + except (ValueError, TypeError, decimal.InvalidOperation): + pass + + +def cvtInt(variant): + return int(variant) + + +def cvtLong(variant): # only important in old versions where long and int differ + return int(variant) + + +def cvtBuffer(variant): + return bytes(variant) + + +def cvtUnicode(variant): + return str(variant) + + +def identity(x): + return x + + +def cvtUnusual(variant): + if verbose > 1: + sys.stderr.write(f"Conversion called for Unusual data={variant!r}\n") + return variant # cannot find conversion function -- just give the data to the user + + +def convert_to_python(variant, func): # convert DB value into Python value + if variant is None: + return None + return func(variant) # call the appropriate conversion function + + +class MultiMap(dict[int, Callable[[object], object]]): + # builds a dictionary from {(iterable,of,keys) : function} + """A dictionary of ado.type : function + -- but you can set multiple items by passing an iterable of keys""" + + # useful for defining conversion functions for groups of similar data types. + def __init__(self, aDict: Mapping[Iterable[int] | int, Callable[[object], object]]): + for k, v in aDict.items(): + self[k] = v # we must call __setitem__ + + def __setitem__( + self, adoType: Iterable[int] | int, cvtFn: Callable[[object], object] + ): + "set a single item, or a whole iterable of items" + if isinstance(adoType, Iterable): + # user passed us an iterable, set them individually + for type in adoType: + dict.__setitem__(self, type, cvtFn) + else: + dict.__setitem__(self, adoType, cvtFn) + + +# initialize variantConversions dictionary used to convert SQL to Python +# this is the dictionary of default conversion functions, built by the class above. +# this becomes a class attribute for the Connection, and that attribute is used +# to build the list of column conversion functions for the Cursor +variantConversions = MultiMap( + { + adoDateTimeTypes: variantConvertDate, + adoApproximateNumericTypes: cvtFloat, + adoExactNumericTypes: cvtDecimal, # use to force decimal rather than unicode + adoLongTypes: cvtLong, + adoIntegerTypes: cvtInt, + adoRowIdTypes: cvtInt, + adoStringTypes: identity, + adoBinaryTypes: cvtBuffer, + adoRemainingTypes: cvtUnusual, + } +) + +# # # # # classes to emulate the result of cursor.fetchxxx() as a sequence of sequences # # # # # +# "an ENUM of how my low level records are laid out" +RS_WIN_32, RS_ARRAY, RS_REMOTE = list(range(1, 4)) + + +class SQLrow: # a single database row + # class to emulate a sequence, so that a column may be retrieved by either number or name + def __init__(self, rows, index): # "rows" is an _SQLrows object, index is which row + self.rows = rows # parent 'fetch' container object + self.index = index # my row number within parent + + def __getattr__(self, name): # used for row.columnName type of value access + try: + return self._getValue(self.rows.columnNames[name.lower()]) + except KeyError: + raise AttributeError('Unknown column name "{}"'.format(name)) + + def _getValue(self, key): # key must be an integer + if ( + self.rows.recordset_format == RS_ARRAY + ): # retrieve from two-dimensional array + v = self.rows.ado_results[key, self.index] + elif self.rows.recordset_format == RS_REMOTE: + v = self.rows.ado_results[self.index][key] + else: # pywin32 - retrieve from tuple of tuples + v = self.rows.ado_results[key][self.index] + if self.rows.converters is NotImplemented: + return v + return convert_to_python(v, self.rows.converters[key]) + + def __len__(self): + return self.rows.numberOfColumns + + def __getitem__(self, key): # used for row[key] type of value access + if isinstance(key, int): # normal row[1] designation + try: + return self._getValue(key) + except IndexError: + raise + if isinstance(key, slice): + indices = key.indices(self.rows.numberOfColumns) + vl = [self._getValue(i) for i in range(*indices)] + return tuple(vl) + try: + return self._getValue( + self.rows.columnNames[key.lower()] + ) # extension row[columnName] designation + except (KeyError, TypeError): + er, st, tr = sys.exc_info() + raise er(f'No such key as "{key!r}" in {self!r}').with_traceback(tr) + + def __iter__(self): + return iter(self.__next__()) + + def __next__(self): + for n in range(self.rows.numberOfColumns): + yield self._getValue(n) + + def __repr__(self): # create a human readable representation + taglist = sorted(list(self.rows.columnNames.items()), key=lambda x: x[1]) + s = "" + + def __str__(self): # create a pretty human readable representation + return str( + tuple(str(self._getValue(i)) for i in range(self.rows.numberOfColumns)) + ) + + # TO-DO implement pickling an SQLrow directly + # def __getstate__(self): return self.__dict__ + # def __setstate__(self, d): self.__dict__.update(d) + # which basically tell pickle to treat your class just like a normal one, + # taking self.__dict__ as representing the whole of the instance state, + # despite the existence of the __getattr__. + # # # # + + +class SQLrows: + # class to emulate a sequence for multiple rows using a container object + def __init__(self, ado_results, numberOfRows, cursor): + self.ado_results = ado_results # raw result of SQL get + try: + self.recordset_format = cursor.recordset_format + self.numberOfColumns = cursor.numberOfColumns + self.converters = cursor.converters + self.columnNames = cursor.columnNames + except AttributeError: + self.recordset_format = RS_ARRAY + self.numberOfColumns = 0 + self.converters = [] + self.columnNames = {} + self.numberOfRows = numberOfRows + + def __len__(self): + return self.numberOfRows + + def __getitem__(self, item): # used for row or row,column access + if not self.ado_results: + return [] + if isinstance(item, slice): # will return a list of row objects + indices = item.indices(self.numberOfRows) + return [SQLrow(self, k) for k in range(*indices)] + elif isinstance(item, tuple) and len(item) == 2: + # d = some_rowsObject[i,j] will return a datum from a two-dimension address + i, j = item + if not isinstance(j, int): + try: + j = self.columnNames[j.lower()] # convert named column to numeric + except KeyError: + raise KeyError(f"adodbapi: no such column name as {j!r}") + if self.recordset_format == RS_ARRAY: # retrieve from two-dimensional array + v = self.ado_results[j, i] + elif self.recordset_format == RS_REMOTE: + v = self.ado_results[i][j] + else: # pywin32 - retrieve from tuple of tuples + v = self.ado_results[j][i] + if self.converters is NotImplemented: + return v + return convert_to_python(v, self.converters[j]) + else: + row = SQLrow(self, item) # new row descriptor + return row + + def __iter__(self): + return iter(self.__next__()) + + def __next__(self): + for n in range(self.numberOfRows): + row = SQLrow(self, n) + yield row + # # # # # + + # # # # # functions to re-format SQL requests to other paramstyle requirements # # # # # # # # # # + + +def changeNamedToQmark( + op, +): # convert from 'named' paramstyle to ADO required '?'mark parameters + outOp = "" + outparms = [] + chunks = op.split( + "'" + ) # quote all literals -- odd numbered list results are literals. + inQuotes = False + for chunk in chunks: + if inQuotes: # this is inside a quote + if chunk == "": # double apostrophe to quote one apostrophe + outOp = outOp[:-1] # so take one away + else: + outOp += "'" + chunk + "'" # else pass the quoted string as is. + else: # is SQL code -- look for a :namedParameter + while chunk: # some SQL string remains + sp = chunk.split(":", 1) + outOp += sp[0] # concat the part up to the : + s = "" + try: + chunk = sp[1] + except IndexError: + chunk = None + if chunk: # there was a parameter - parse it out + i = 0 + c = chunk[0] + while c.isalnum() or c == "_": + i += 1 + try: + c = chunk[i] + except IndexError: + break + s = chunk[:i] + chunk = chunk[i:] + if s: + outparms.append(s) # list the parameters in order + outOp += "?" # put in the Qmark + inQuotes = not inQuotes + return outOp, outparms + + +def changeFormatToQmark( + op, +): # convert from 'format' paramstyle to ADO required '?'mark parameters + outOp = "" + outparams = [] + chunks = op.split( + "'" + ) # quote all literals -- odd numbered list results are literals. + inQuotes = False + for chunk in chunks: + if inQuotes: + if ( + outOp != "" and chunk == "" + ): # he used a double apostrophe to quote one apostrophe + outOp = outOp[:-1] # so take one away + else: + outOp += "'" + chunk + "'" # else pass the quoted string as is. + else: # is SQL code -- look for a %s parameter + if "%(" in chunk: # ugh! pyformat! + while chunk: # some SQL string remains + sp = chunk.split("%(", 1) + outOp += sp[0] # concat the part up to the % + if len(sp) > 1: + try: + s, chunk = sp[1].split(")s", 1) # find the ')s' + except ValueError: + raise ProgrammingError( + 'Pyformat SQL has incorrect format near "%s"' % chunk + ) + outparams.append(s) + outOp += "?" # put in the Qmark + else: + chunk = None + else: # proper '%s' format + sp = chunk.split("%s") # make each %s + outOp += "?".join(sp) # into ? + inQuotes = not inQuotes # every other chunk is a quoted string + return outOp, outparams diff --git a/adodbapi/examples/db_print.py b/adodbapi/examples/db_print.py index fc86a8b3c8..33a6511388 100644 --- a/adodbapi/examples/db_print.py +++ b/adodbapi/examples/db_print.py @@ -1,72 +1,72 @@ -"""db_print.py -- a simple demo for ADO database reads.""" - -import sys - -import adodbapi.ado_consts as adc - -cmd_args = ("filename", "table_name") -if "help" in sys.argv: - print("possible settings keywords are:", cmd_args) - sys.exit() - -kw_args = {} # pick up filename and proxy address from command line (optionally) -for arg in sys.argv: - s = arg.split("=") - if len(s) > 1: - if s[0] in cmd_args: - kw_args[s[0]] = s[1] - -kw_args.setdefault( - "filename", "test.mdb" -) # assumes server is running from examples folder -kw_args.setdefault("table_name", "Products") # the name of the demo table - -# the server needs to select the provider based on his Python installation -provider_switch = ["provider", "Microsoft.ACE.OLEDB.12.0", "Microsoft.Jet.OLEDB.4.0"] - -# ------------------------ START HERE ------------------------------------- -# create the connection -constr = "Provider=%(provider)s;Data Source=%(filename)s" -import adodbapi as db - -con = db.connect(constr, kw_args, macro_is64bit=provider_switch) - -if kw_args["table_name"] == "?": - print("The tables in your database are:") - for name in con.get_table_names(): - print(name) -else: - # make a cursor on the connection - with con.cursor() as c: - # run an SQL statement on the cursor - sql = "select * from %s" % kw_args["table_name"] - print('performing query="%s"' % sql) - c.execute(sql) - - # check the results - print( - 'result rowcount shows as= %d. (Note: -1 means "not known")' % (c.rowcount,) - ) - print("") - print("result data description is:") - print(" NAME Type DispSize IntrnlSz Prec Scale Null?") - for d in c.description: - print( - ("%16s %-12s %8s %8d %4d %5d %s") - % (d[0], adc.adTypeNames[d[1]], d[2], d[3], d[4], d[5], bool(d[6])) - ) - print("") - print("str() of first five records are...") - - # get the results - db = c.fetchmany(5) - - # print them - for rec in db: - print(rec) - - print("") - print("repr() of next row is...") - print(repr(c.fetchone())) - print("") -con.close() +"""db_print.py -- a simple demo for ADO database reads.""" + +import sys + +import adodbapi.ado_consts as adc + +cmd_args = ("filename", "table_name") +if "help" in sys.argv: + print("possible settings keywords are:", cmd_args) + sys.exit() + +kw_args = {} # pick up filename and proxy address from command line (optionally) +for arg in sys.argv: + s = arg.split("=") + if len(s) > 1: + if s[0] in cmd_args: + kw_args[s[0]] = s[1] + +kw_args.setdefault( + "filename", "test.mdb" +) # assumes server is running from examples folder +kw_args.setdefault("table_name", "Products") # the name of the demo table + +# the server needs to select the provider based on his Python installation +provider_switch = ["provider", "Microsoft.ACE.OLEDB.12.0", "Microsoft.Jet.OLEDB.4.0"] + +# ------------------------ START HERE ------------------------------------- +# create the connection +constr = "Provider=%(provider)s;Data Source=%(filename)s" +import adodbapi as db + +con = db.connect(constr, kw_args, macro_is64bit=provider_switch) + +if kw_args["table_name"] == "?": + print("The tables in your database are:") + for name in con.get_table_names(): + print(name) +else: + # make a cursor on the connection + with con.cursor() as c: + # run an SQL statement on the cursor + sql = "select * from %s" % kw_args["table_name"] + print('performing query="%s"' % sql) + c.execute(sql) + + # check the results + print( + 'result rowcount shows as= %d. (Note: -1 means "not known")' % (c.rowcount,) + ) + print("") + print("result data description is:") + print(" NAME Type DispSize IntrnlSz Prec Scale Null?") + for d in c.description: + print( + ("%16s %-12s %8s %8d %4d %5d %s") + % (d[0], adc.adTypeNames[d[1]], d[2], d[3], d[4], d[5], bool(d[6])) + ) + print("") + print("str() of first five records are...") + + # get the results + db = c.fetchmany(5) + + # print them + for rec in db: + print(rec) + + print("") + print("repr() of next row is...") + print(repr(c.fetchone())) + print("") +con.close() diff --git a/adodbapi/examples/db_table_names.py b/adodbapi/examples/db_table_names.py index 17ff583491..e78fc358ec 100644 --- a/adodbapi/examples/db_table_names.py +++ b/adodbapi/examples/db_table_names.py @@ -1,21 +1,21 @@ -"""db_table_names.py -- a simple demo for ADO database table listing.""" - -import sys - -import adodbapi - -try: - databasename = sys.argv[1] -except IndexError: - databasename = "test.mdb" - -provider = ["prv", "Microsoft.ACE.OLEDB.12.0", "Microsoft.Jet.OLEDB.4.0"] -constr = "Provider=%(prv)s;Data Source=%(db)s" - -# create the connection -con = adodbapi.connect(constr, db=databasename, macro_is64bit=provider) - -print("Table names in= %s" % databasename) - -for table in con.get_table_names(): - print(table) +"""db_table_names.py -- a simple demo for ADO database table listing.""" + +import sys + +import adodbapi + +try: + databasename = sys.argv[1] +except IndexError: + databasename = "test.mdb" + +provider = ["prv", "Microsoft.ACE.OLEDB.12.0", "Microsoft.Jet.OLEDB.4.0"] +constr = "Provider=%(prv)s;Data Source=%(db)s" + +# create the connection +con = adodbapi.connect(constr, db=databasename, macro_is64bit=provider) + +print("Table names in= %s" % databasename) + +for table in con.get_table_names(): + print(table) diff --git a/adodbapi/examples/xls_read.py b/adodbapi/examples/xls_read.py index 10bcc57e6b..45e0d277ad 100644 --- a/adodbapi/examples/xls_read.py +++ b/adodbapi/examples/xls_read.py @@ -1,41 +1,41 @@ -import sys - -import adodbapi - -try: - import adodbapi.is64bit as is64bit - - is64 = is64bit.Python() -except ImportError: - is64 = False - -if is64: - driver = "Microsoft.ACE.OLEDB.12.0" -else: - driver = "Microsoft.Jet.OLEDB.4.0" -extended = 'Extended Properties="Excel 8.0;HDR=Yes;IMEX=1;"' - -try: # first command line argument will be xls file name -- default to the one written by xls_write.py - filename = sys.argv[1] -except IndexError: - filename = "xx.xls" - -constr = "Provider=%s;Data Source=%s;%s" % (driver, filename, extended) - -conn = adodbapi.connect(constr) - -try: # second command line argument will be worksheet name -- default to first worksheet - sheet = sys.argv[2] -except IndexError: - # use ADO feature to get the name of the first worksheet - sheet = conn.get_table_names()[0] - -print("Shreadsheet=%s Worksheet=%s" % (filename, sheet)) -print("------------------------------------------------------------") -crsr = conn.cursor() -sql = "SELECT * from [%s]" % sheet -crsr.execute(sql) -for row in crsr.fetchmany(10): - print(repr(row)) -crsr.close() -conn.close() +import sys + +import adodbapi + +try: + import adodbapi.is64bit as is64bit + + is64 = is64bit.Python() +except ImportError: + is64 = False + +if is64: + driver = "Microsoft.ACE.OLEDB.12.0" +else: + driver = "Microsoft.Jet.OLEDB.4.0" +extended = 'Extended Properties="Excel 8.0;HDR=Yes;IMEX=1;"' + +try: # first command line argument will be xls file name -- default to the one written by xls_write.py + filename = sys.argv[1] +except IndexError: + filename = "xx.xls" + +constr = "Provider=%s;Data Source=%s;%s" % (driver, filename, extended) + +conn = adodbapi.connect(constr) + +try: # second command line argument will be worksheet name -- default to first worksheet + sheet = sys.argv[2] +except IndexError: + # use ADO feature to get the name of the first worksheet + sheet = conn.get_table_names()[0] + +print("Shreadsheet=%s Worksheet=%s" % (filename, sheet)) +print("------------------------------------------------------------") +crsr = conn.cursor() +sql = "SELECT * from [%s]" % sheet +crsr.execute(sql) +for row in crsr.fetchmany(10): + print(repr(row)) +crsr.close() +conn.close() diff --git a/adodbapi/examples/xls_write.py b/adodbapi/examples/xls_write.py index 38baefd812..9d1d311444 100644 --- a/adodbapi/examples/xls_write.py +++ b/adodbapi/examples/xls_write.py @@ -1,41 +1,41 @@ -import datetime - -import adodbapi - -try: - import adodbapi.is64bit as is64bit - - is64 = is64bit.Python() -except ImportError: - is64 = False # in case the user has an old version of adodbapi -if is64: - driver = "Microsoft.ACE.OLEDB.12.0" -else: - driver = "Microsoft.Jet.OLEDB.4.0" -filename = "xx.xls" # file will be created if it does not exist -extended = 'Extended Properties="Excel 8.0;Readonly=False;"' - -constr = "Provider=%s;Data Source=%s;%s" % (driver, filename, extended) - -conn = adodbapi.connect(constr) -with conn: # will auto commit if no errors - with conn.cursor() as crsr: - try: - crsr.execute("drop table SheetOne") - except: - pass # just is case there is one already there - - # create the sheet and the header row and set the types for the columns - crsr.execute( - "create table SheetOne (Name varchar, Rank varchar, SrvcNum integer, Weight float, Birth date)" - ) - - sql = "INSERT INTO SheetOne (name, rank , srvcnum, weight, birth) values (?,?,?,?,?)" - - data = ("Mike Murphy", "SSG", 123456789, 167.8, datetime.date(1922, 12, 27)) - crsr.execute(sql, data) # write the first row of data - crsr.execute( - sql, ["John Jones", "Pvt", 987654321, 140.0, datetime.date(1921, 7, 4)] - ) # another row of data -conn.close() -print("Created spreadsheet=%s worksheet=%s" % (filename, "SheetOne")) +import datetime + +import adodbapi + +try: + import adodbapi.is64bit as is64bit + + is64 = is64bit.Python() +except ImportError: + is64 = False # in case the user has an old version of adodbapi +if is64: + driver = "Microsoft.ACE.OLEDB.12.0" +else: + driver = "Microsoft.Jet.OLEDB.4.0" +filename = "xx.xls" # file will be created if it does not exist +extended = 'Extended Properties="Excel 8.0;Readonly=False;"' + +constr = "Provider=%s;Data Source=%s;%s" % (driver, filename, extended) + +conn = adodbapi.connect(constr) +with conn: # will auto commit if no errors + with conn.cursor() as crsr: + try: + crsr.execute("drop table SheetOne") + except: + pass # just is case there is one already there + + # create the sheet and the header row and set the types for the columns + crsr.execute( + "create table SheetOne (Name varchar, Rank varchar, SrvcNum integer, Weight float, Birth date)" + ) + + sql = "INSERT INTO SheetOne (name, rank , srvcnum, weight, birth) values (?,?,?,?,?)" + + data = ("Mike Murphy", "SSG", 123456789, 167.8, datetime.date(1922, 12, 27)) + crsr.execute(sql, data) # write the first row of data + crsr.execute( + sql, ["John Jones", "Pvt", 987654321, 140.0, datetime.date(1921, 7, 4)] + ) # another row of data +conn.close() +print("Created spreadsheet=%s worksheet=%s" % (filename, "SheetOne")) diff --git a/adodbapi/is64bit.py b/adodbapi/is64bit.py index dd061ef555..88c1fbc46f 100644 --- a/adodbapi/is64bit.py +++ b/adodbapi/is64bit.py @@ -1,34 +1,34 @@ -"""is64bit.Python() --> boolean value of detected Python word size. is64bit.os() --> os build version""" - -import sys - - -def Python(): - return sys.maxsize > 2147483647 - - -def os(): - import platform - - pm = platform.machine() - if pm != ".." and pm.endswith("64"): # recent 64 bit Python - return True - else: - import os - - if "PROCESSOR_ARCHITEW6432" in os.environ: - return True # 32 bit program running on 64 bit Windows - try: - return os.environ["PROCESSOR_ARCHITECTURE"].endswith( - "64" - ) # 64 bit Windows 64 bit program - except (IndexError, KeyError): - pass # not Windows - try: - return "64" in platform.architecture()[0] # this often works in Linux - except: - return False # is an older version of Python, assume also an older os (best we can guess) - - -if __name__ == "__main__": - print("is64bit.Python() =", Python(), "is64bit.os() =", os()) +"""is64bit.Python() --> boolean value of detected Python word size. is64bit.os() --> os build version""" + +import sys + + +def Python(): + return sys.maxsize > 2147483647 + + +def os(): + import platform + + pm = platform.machine() + if pm != ".." and pm.endswith("64"): # recent 64 bit Python + return True + else: + import os + + if "PROCESSOR_ARCHITEW6432" in os.environ: + return True # 32 bit program running on 64 bit Windows + try: + return os.environ["PROCESSOR_ARCHITECTURE"].endswith( + "64" + ) # 64 bit Windows 64 bit program + except (IndexError, KeyError): + pass # not Windows + try: + return "64" in platform.architecture()[0] # this often works in Linux + except: + return False # is an older version of Python, assume also an older os (best we can guess) + + +if __name__ == "__main__": + print("is64bit.Python() =", Python(), "is64bit.os() =", os()) diff --git a/adodbapi/process_connect_string.py b/adodbapi/process_connect_string.py index 320d1bb35e..79c3ce0af0 100644 --- a/adodbapi/process_connect_string.py +++ b/adodbapi/process_connect_string.py @@ -1,137 +1,137 @@ -"""a clumsy attempt at a macro language to let the programmer execute code on the server (ex: determine 64bit)""" - -from . import is64bit - - -def macro_call(macro_name, args, kwargs): - """allow the programmer to perform limited processing on the server by passing macro names and args - - :new_key - the key name the macro will create - :args[0] - macro name - :args[1:] - any arguments - :code - the value of the keyword item - :kwargs - the connection keyword dictionary. ??key has been removed - --> the value to put in for kwargs['name'] = value - """ - if isinstance(args, (str, str)): - args = [ - args - ] # the user forgot to pass a sequence, so make a string into args[0] - new_key = args[0] - try: - if macro_name == "is64bit": - if is64bit.Python(): # if on 64 bit Python - return new_key, args[1] # return first argument - else: - try: - return new_key, args[2] # else return second argument (if defined) - except IndexError: - return new_key, "" # else return blank - - elif ( - macro_name == "getuser" - ): # get the name of the user the server is logged in under - if not new_key in kwargs: - import getpass - - return new_key, getpass.getuser() - - elif macro_name == "getnode": # get the name of the computer running the server - import platform - - try: - return new_key, args[1] % platform.node() - except IndexError: - return new_key, platform.node() - - elif macro_name == "getenv": # expand the server's environment variable args[1] - import os - - try: - dflt = args[2] # if not found, default from args[2] - except IndexError: # or blank - dflt = "" - return new_key, os.environ.get(args[1], dflt) - - elif macro_name == "auto_security": - if ( - not "user" in kwargs or not kwargs["user"] - ): # missing, blank, or Null username - return new_key, "Integrated Security=SSPI" - return new_key, "User ID=%(user)s; Password=%(password)s" % kwargs - - elif ( - macro_name == "find_temp_test_path" - ): # helper function for testing ado operation -- undocumented - import os - import tempfile - - return new_key, os.path.join( - tempfile.gettempdir(), "adodbapi_test", args[1] - ) - - raise ValueError(f"Unknown connect string macro={macro_name}") - except: - raise ValueError(f"Error in macro processing {macro_name} {args!r}") - - -def process( - args, kwargs, expand_macros=False -): # --> connection string with keyword arguments processed. - """attempts to inject arguments into a connection string using Python "%" operator for strings - - co: adodbapi connection object - args: positional parameters from the .connect() call - kvargs: keyword arguments from the .connect() call - """ - try: - dsn = args[0] - except IndexError: - dsn = None - # as a convenience the first argument may be django settings - if isinstance(dsn, dict): - kwargs.update(dsn) - # the connection string is passed to the connection as part of the keyword dictionary - elif dsn: - kwargs["connection_string"] = dsn - try: - a1 = args[1] - except IndexError: - a1 = None - # historically, the second positional argument might be a timeout value - if isinstance(a1, int): - kwargs["timeout"] = a1 - # if the second positional argument is a string, then it is user - elif isinstance(a1, str): - kwargs["user"] = a1 - # if the second positional argument is a dictionary, use it as keyword arguments, too - elif isinstance(a1, dict): - kwargs.update(a1) - try: - kwargs["password"] = args[2] # the third positional argument is password - kwargs["host"] = args[3] # the fourth positional argument is host name - kwargs["database"] = args[4] # the fifth positional argument is database name - except IndexError: - pass - - # make sure connection string is defined somehow - if not "connection_string" in kwargs: - try: # perhaps 'dsn' was defined - kwargs["connection_string"] = kwargs["dsn"] - except KeyError: - try: # as a last effort, use the "host" keyword - kwargs["connection_string"] = kwargs["host"] - except KeyError: - raise TypeError("Must define 'connection_string' for ado connections") - if expand_macros: - for kwarg in list(kwargs.keys()): - if kwarg.startswith("macro_"): # If a key defines a macro - macro_name = kwarg[6:] # name without the "macro_" - macro_code = kwargs.pop( - kwarg - ) # we remove the macro_key and get the code to execute - new_key, rslt = macro_call( - macro_name, macro_code, kwargs - ) # run the code in the local context - kwargs[new_key] = rslt # put the result back in the keywords dict - return kwargs +"""a clumsy attempt at a macro language to let the programmer execute code on the server (ex: determine 64bit)""" + +from . import is64bit + + +def macro_call(macro_name, args, kwargs): + """allow the programmer to perform limited processing on the server by passing macro names and args + + :new_key - the key name the macro will create + :args[0] - macro name + :args[1:] - any arguments + :code - the value of the keyword item + :kwargs - the connection keyword dictionary. ??key has been removed + --> the value to put in for kwargs['name'] = value + """ + if isinstance(args, (str, str)): + args = [ + args + ] # the user forgot to pass a sequence, so make a string into args[0] + new_key = args[0] + try: + if macro_name == "is64bit": + if is64bit.Python(): # if on 64 bit Python + return new_key, args[1] # return first argument + else: + try: + return new_key, args[2] # else return second argument (if defined) + except IndexError: + return new_key, "" # else return blank + + elif ( + macro_name == "getuser" + ): # get the name of the user the server is logged in under + if not new_key in kwargs: + import getpass + + return new_key, getpass.getuser() + + elif macro_name == "getnode": # get the name of the computer running the server + import platform + + try: + return new_key, args[1] % platform.node() + except IndexError: + return new_key, platform.node() + + elif macro_name == "getenv": # expand the server's environment variable args[1] + import os + + try: + dflt = args[2] # if not found, default from args[2] + except IndexError: # or blank + dflt = "" + return new_key, os.environ.get(args[1], dflt) + + elif macro_name == "auto_security": + if ( + not "user" in kwargs or not kwargs["user"] + ): # missing, blank, or Null username + return new_key, "Integrated Security=SSPI" + return new_key, "User ID=%(user)s; Password=%(password)s" % kwargs + + elif ( + macro_name == "find_temp_test_path" + ): # helper function for testing ado operation -- undocumented + import os + import tempfile + + return new_key, os.path.join( + tempfile.gettempdir(), "adodbapi_test", args[1] + ) + + raise ValueError(f"Unknown connect string macro={macro_name}") + except: + raise ValueError(f"Error in macro processing {macro_name} {args!r}") + + +def process( + args, kwargs, expand_macros=False +): # --> connection string with keyword arguments processed. + """attempts to inject arguments into a connection string using Python "%" operator for strings + + co: adodbapi connection object + args: positional parameters from the .connect() call + kvargs: keyword arguments from the .connect() call + """ + try: + dsn = args[0] + except IndexError: + dsn = None + # as a convenience the first argument may be django settings + if isinstance(dsn, dict): + kwargs.update(dsn) + # the connection string is passed to the connection as part of the keyword dictionary + elif dsn: + kwargs["connection_string"] = dsn + try: + a1 = args[1] + except IndexError: + a1 = None + # historically, the second positional argument might be a timeout value + if isinstance(a1, int): + kwargs["timeout"] = a1 + # if the second positional argument is a string, then it is user + elif isinstance(a1, str): + kwargs["user"] = a1 + # if the second positional argument is a dictionary, use it as keyword arguments, too + elif isinstance(a1, dict): + kwargs.update(a1) + try: + kwargs["password"] = args[2] # the third positional argument is password + kwargs["host"] = args[3] # the fourth positional argument is host name + kwargs["database"] = args[4] # the fifth positional argument is database name + except IndexError: + pass + + # make sure connection string is defined somehow + if not "connection_string" in kwargs: + try: # perhaps 'dsn' was defined + kwargs["connection_string"] = kwargs["dsn"] + except KeyError: + try: # as a last effort, use the "host" keyword + kwargs["connection_string"] = kwargs["host"] + except KeyError: + raise TypeError("Must define 'connection_string' for ado connections") + if expand_macros: + for kwarg in list(kwargs.keys()): + if kwarg.startswith("macro_"): # If a key defines a macro + macro_name = kwarg[6:] # name without the "macro_" + macro_code = kwargs.pop( + kwarg + ) # we remove the macro_key and get the code to execute + new_key, rslt = macro_call( + macro_name, macro_code, kwargs + ) # run the code in the local context + kwargs[new_key] = rslt # put the result back in the keywords dict + return kwargs diff --git a/adodbapi/readme.txt b/adodbapi/readme.txt index e060d7c966..9ae7d4252b 100644 --- a/adodbapi/readme.txt +++ b/adodbapi/readme.txt @@ -1,88 +1,88 @@ -Project -------- -adodbapi - -A Python DB-API 2.0 (PEP-249) module that makes it easy to use Microsoft ADO -for connecting with databases and other data sources using CPython. - -Home page: - -Features: -* 100% DB-API 2.0 (PEP-249) compliant (including most extensions and recommendations). -* Includes pyunit testcases that describe how to use the module. -* Fully implemented in Python. -- runs in current versions of Python 3 -* Licensed under the LGPL license, which means that it can be used freely even in commercial programs subject to certain restrictions. -* The user can choose between paramstyles: 'qmark' 'named' 'format' 'pyformat' 'dynamic' -* Supports data retrieval by column name e.g.: - for row in myCurser.execute("select name,age from students"): - print("Student", row.name, "is", row.age, "years old.") -* Supports user-definable system-to-Python data conversion functions (selected by ADO data type, or by column) - -Prerequisites: -* C Python 3.6 or higher - and pywin32 (Mark Hammond's python for windows extensions.) - -Installation: -* (C-Python on Windows): Install pywin32 (`python -m pip install pywin32`) which includes adodbapi. -* (IronPython on Windows): Download adodbapi from https://sourceforge.net/projects/adodbapi/ . Unpack the zip. - -NOTE: ........... -If you do not like the new default operation of returning Numeric columns as decimal.Decimal, -you can select other options by the user defined conversion feature. -Try: - adodbapi.apibase.variantConversions[adodbapi.ado_consts.adNumeric] = adodbapi.apibase.cvtString -or: - adodbapi.apibase.variantConversions[adodbapi.ado_consts.adNumeric] = adodbapi.apibase.cvtFloat -or: - adodbapi.apibase.variantConversions[adodbapi.ado_consts.adNumeric] = write_your_own_conversion_function - ............ -notes for 2.6.2: - The definitive source has been moved to https://github.com/mhammond/pywin32/tree/main/adodbapi. - Remote has proven too hard to configure and test with Pyro4. I am moving it to unsupported status - until I can change to a different connection method. -what's new in version 2.6 - A cursor.prepare() method and support for prepared SQL statements. - Lots of refactoring, especially of the Remote and Server modules (still to be treated as Beta code). - The quick start document 'quick_reference.odt' will export as a nice-looking pdf. - Added paramstyles 'pyformat' and 'dynamic'. If your 'paramstyle' is 'named' you _must_ pass a dictionary of - parameters to your .execute() method. If your 'paramstyle' is 'format' 'pyformat' or 'dynamic', you _may_ - pass a dictionary of parameters -- provided your SQL operation string is formatted correctly. - -what's new in version 2.5 - Remote module: (works on Linux!) allows a Windows computer to serve ADO databases via PyRO - Server module: PyRO server for ADO. Run using a command like= C:>python -m adodbapi.server - (server has simple connection string macros: is64bit, getuser, sql_provider, auto_security) - Brief documentation included. See adodbapi/examples folder adodbapi.rtf - New connection method conn.get_table_names() --> list of names of tables in database - - Vastly refactored. Data conversion things have been moved to the new adodbapi.apibase module. - Many former module-level attributes are now class attributes. (Should be more thread-safe) - Connection objects are now context managers for transactions and will commit or rollback. - Cursor objects are context managers and will automatically close themselves. - Autocommit can be switched on and off. - Keyword and positional arguments on the connect() method work as documented in PEP 249. - Keyword arguments from the connect call can be formatted into the connection string. - New keyword arguments defined, such as: autocommit, paramstyle, remote_proxy, remote_port. - *** Breaking change: variantConversion lookups are simplified: the following will raise KeyError: - oldconverter=adodbapi.variantConversions[adodbapi.adoStringTypes] - Refactor as: oldconverter=adodbapi.variantConversions[adodbapi.adoStringTypes[0]] - -License -------- -LGPL, see https://opensource.org/license/lgpl-2-1 - -Documentation -------------- - -Look at: -- `adodbapi/quick_reference.md` -- https://wiki.python.org/moin/DatabaseProgramming#The_DB-API -- read the examples in adodbapi/examples -- and the test cases in `adodbapi/test directory` - -Mailing lists -------------- -The adodbapi mailing lists have been deactivated. Submit comments to the -pywin32 mailing lists. - -- the bug tracker on sourceforge.net/projects/adodbapi may be checked, (infrequently). - -- please use: https://github.com/mhammond/pywin32/issues +Project +------- +adodbapi + +A Python DB-API 2.0 (PEP-249) module that makes it easy to use Microsoft ADO +for connecting with databases and other data sources using CPython. + +Home page: + +Features: +* 100% DB-API 2.0 (PEP-249) compliant (including most extensions and recommendations). +* Includes pyunit testcases that describe how to use the module. +* Fully implemented in Python. -- runs in current versions of Python 3 +* Licensed under the LGPL license, which means that it can be used freely even in commercial programs subject to certain restrictions. +* The user can choose between paramstyles: 'qmark' 'named' 'format' 'pyformat' 'dynamic' +* Supports data retrieval by column name e.g.: + for row in myCurser.execute("select name,age from students"): + print("Student", row.name, "is", row.age, "years old.") +* Supports user-definable system-to-Python data conversion functions (selected by ADO data type, or by column) + +Prerequisites: +* C Python 3.6 or higher + and pywin32 (Mark Hammond's python for windows extensions.) + +Installation: +* (C-Python on Windows): Install pywin32 (`python -m pip install pywin32`) which includes adodbapi. +* (IronPython on Windows): Download adodbapi from https://sourceforge.net/projects/adodbapi/ . Unpack the zip. + +NOTE: ........... +If you do not like the new default operation of returning Numeric columns as decimal.Decimal, +you can select other options by the user defined conversion feature. +Try: + adodbapi.apibase.variantConversions[adodbapi.ado_consts.adNumeric] = adodbapi.apibase.cvtString +or: + adodbapi.apibase.variantConversions[adodbapi.ado_consts.adNumeric] = adodbapi.apibase.cvtFloat +or: + adodbapi.apibase.variantConversions[adodbapi.ado_consts.adNumeric] = write_your_own_conversion_function + ............ +notes for 2.6.2: + The definitive source has been moved to https://github.com/mhammond/pywin32/tree/main/adodbapi. + Remote has proven too hard to configure and test with Pyro4. I am moving it to unsupported status + until I can change to a different connection method. +what's new in version 2.6 + A cursor.prepare() method and support for prepared SQL statements. + Lots of refactoring, especially of the Remote and Server modules (still to be treated as Beta code). + The quick start document 'quick_reference.odt' will export as a nice-looking pdf. + Added paramstyles 'pyformat' and 'dynamic'. If your 'paramstyle' is 'named' you _must_ pass a dictionary of + parameters to your .execute() method. If your 'paramstyle' is 'format' 'pyformat' or 'dynamic', you _may_ + pass a dictionary of parameters -- provided your SQL operation string is formatted correctly. + +what's new in version 2.5 + Remote module: (works on Linux!) allows a Windows computer to serve ADO databases via PyRO + Server module: PyRO server for ADO. Run using a command like= C:>python -m adodbapi.server + (server has simple connection string macros: is64bit, getuser, sql_provider, auto_security) + Brief documentation included. See adodbapi/examples folder adodbapi.rtf + New connection method conn.get_table_names() --> list of names of tables in database + + Vastly refactored. Data conversion things have been moved to the new adodbapi.apibase module. + Many former module-level attributes are now class attributes. (Should be more thread-safe) + Connection objects are now context managers for transactions and will commit or rollback. + Cursor objects are context managers and will automatically close themselves. + Autocommit can be switched on and off. + Keyword and positional arguments on the connect() method work as documented in PEP 249. + Keyword arguments from the connect call can be formatted into the connection string. + New keyword arguments defined, such as: autocommit, paramstyle, remote_proxy, remote_port. + *** Breaking change: variantConversion lookups are simplified: the following will raise KeyError: + oldconverter=adodbapi.variantConversions[adodbapi.adoStringTypes] + Refactor as: oldconverter=adodbapi.variantConversions[adodbapi.adoStringTypes[0]] + +License +------- +LGPL, see https://opensource.org/license/lgpl-2-1 + +Documentation +------------- + +Look at: +- `adodbapi/quick_reference.md` +- https://wiki.python.org/moin/DatabaseProgramming#The_DB-API +- read the examples in adodbapi/examples +- and the test cases in `adodbapi/test directory` + +Mailing lists +------------- +The adodbapi mailing lists have been deactivated. Submit comments to the +pywin32 mailing lists. + -- the bug tracker on sourceforge.net/projects/adodbapi may be checked, (infrequently). + -- please use: https://github.com/mhammond/pywin32/issues diff --git a/adodbapi/schema_table.py b/adodbapi/schema_table.py index 636766bba5..17fb965da3 100644 --- a/adodbapi/schema_table.py +++ b/adodbapi/schema_table.py @@ -1,16 +1,16 @@ -"""call using an open ADO connection --> list of table names""" - -from . import adodbapi - - -def names(connection_object): - ado = connection_object.adoConn - schema = ado.OpenSchema(20) # constant = adSchemaTables - - tables = [] - while not schema.EOF: - name = adodbapi.getIndexedValue(schema.Fields, "TABLE_NAME").Value - tables.append(name) - schema.MoveNext() - del schema - return tables +"""call using an open ADO connection --> list of table names""" + +from . import adodbapi + + +def names(connection_object): + ado = connection_object.adoConn + schema = ado.OpenSchema(20) # constant = adSchemaTables + + tables = [] + while not schema.EOF: + name = adodbapi.getIndexedValue(schema.Fields, "TABLE_NAME").Value + tables.append(name) + schema.MoveNext() + del schema + return tables diff --git a/adodbapi/test/is64bit.py b/adodbapi/test/is64bit.py index 16a53e2e5b..55c7ddab9f 100644 --- a/adodbapi/test/is64bit.py +++ b/adodbapi/test/is64bit.py @@ -1,34 +1,34 @@ -"""is64bit.Python() --> boolean value of detected Python word size. is64bit.os() --> os build version""" - -import sys - - -def Python(): - return sys.maxsize > 2147483647 - - -def os(): - import platform - - pm = platform.machine() - if pm != ".." and pm.endswith("64"): # recent 64 bit Python - return True - else: - import os - - if "PROCESSOR_ARCHITEW6432" in os.environ: - return True # 32 bit program running on 64 bit Windows - try: - return os.environ["PROCESSOR_ARCHITECTURE"].endswith( - "64" - ) # 64 bit Windows 64 bit program - except IndexError: - pass # not Windows - try: - return "64" in platform.architecture()[0] # this often works in Linux - except: - return False # is an older version of Python, assume also an older os (best we can guess) - - -if __name__ == "__main__": - print("is64bit.Python() =", Python(), "is64bit.os() =", os()) +"""is64bit.Python() --> boolean value of detected Python word size. is64bit.os() --> os build version""" + +import sys + + +def Python(): + return sys.maxsize > 2147483647 + + +def os(): + import platform + + pm = platform.machine() + if pm != ".." and pm.endswith("64"): # recent 64 bit Python + return True + else: + import os + + if "PROCESSOR_ARCHITEW6432" in os.environ: + return True # 32 bit program running on 64 bit Windows + try: + return os.environ["PROCESSOR_ARCHITECTURE"].endswith( + "64" + ) # 64 bit Windows 64 bit program + except IndexError: + pass # not Windows + try: + return "64" in platform.architecture()[0] # this often works in Linux + except: + return False # is an older version of Python, assume also an older os (best we can guess) + + +if __name__ == "__main__": + print("is64bit.Python() =", Python(), "is64bit.os() =", os()) diff --git a/adodbapi/test/setuptestframework.py b/adodbapi/test/setuptestframework.py index 4b9de6a7d4..57d709c1f1 100644 --- a/adodbapi/test/setuptestframework.py +++ b/adodbapi/test/setuptestframework.py @@ -1,98 +1,98 @@ -#!/usr/bin/python2 -# Configure this in order to run the testcases. -"setuptestframework.py v 2.6.0.8" - -import os -import shutil -import tempfile - - -def maketemp(): - temphome = tempfile.gettempdir() - tempdir = os.path.join(temphome, "adodbapi_test") - try: - os.mkdir(tempdir) - except: - pass - return tempdir - - -def _cleanup_function(testfolder, mdb_name): - try: - os.unlink(os.path.join(testfolder, mdb_name)) - except: - pass # mdb database not present - try: - shutil.rmtree(testfolder) - print(" cleaned up folder", testfolder) - except: - pass # test package not present - - -def getcleanupfunction(): - return _cleanup_function - - -def find_ado_path(): - adoName = os.path.normpath(os.getcwd() + "/../../adodbapi.py") - adoPackage = os.path.dirname(adoName) - return adoPackage - - -# make a new package directory for the test copy of ado -def makeadopackage(testfolder): - adoName = os.path.normpath(os.getcwd() + "/../adodbapi.py") - adoPath = os.path.dirname(adoName) - if os.path.exists(adoName): - newpackage = os.path.join(testfolder, "adodbapi") - try: - os.makedirs(newpackage) - except OSError: - print( - "*Note: temporary adodbapi package already exists: may be two versions running?" - ) - for f in os.listdir(adoPath): - if f.endswith(".py"): - shutil.copy(os.path.join(adoPath, f), newpackage) - return testfolder - else: - raise OSError("Cannot find source of adodbapi to test.") - - -def makemdb(testfolder, mdb_name): - # following setup code borrowed from pywin32 odbc test suite - # kindly contributed by Frank Millman. - import os - - _accessdatasource = os.path.join(testfolder, mdb_name) - if os.path.isfile(_accessdatasource): - print("using JET database=", _accessdatasource) - else: - from win32com.client import constants - from win32com.client.gencache import EnsureDispatch - - # Create a brand-new database - what is the story with these? - dbe = None - for suffix in (".36", ".35", ".30"): - try: - dbe = EnsureDispatch("DAO.DBEngine" + suffix) - break - except: - pass - if dbe: - print(" ...Creating ACCESS db at " + _accessdatasource) - workspace = dbe.Workspaces(0) - newdb = workspace.CreateDatabase( - _accessdatasource, constants.dbLangGeneral, constants.dbVersion40 - ) - newdb.Close() - else: - print(" ...copying test ACCESS db to " + _accessdatasource) - mdbName = os.path.abspath( - os.path.join(os.path.dirname(__file__), "..", "examples", "test.mdb") - ) - import shutil - - shutil.copy(mdbName, _accessdatasource) - - return _accessdatasource +#!/usr/bin/python2 +# Configure this in order to run the testcases. +"setuptestframework.py v 2.6.0.8" + +import os +import shutil +import tempfile + + +def maketemp(): + temphome = tempfile.gettempdir() + tempdir = os.path.join(temphome, "adodbapi_test") + try: + os.mkdir(tempdir) + except: + pass + return tempdir + + +def _cleanup_function(testfolder, mdb_name): + try: + os.unlink(os.path.join(testfolder, mdb_name)) + except: + pass # mdb database not present + try: + shutil.rmtree(testfolder) + print(" cleaned up folder", testfolder) + except: + pass # test package not present + + +def getcleanupfunction(): + return _cleanup_function + + +def find_ado_path(): + adoName = os.path.normpath(os.getcwd() + "/../../adodbapi.py") + adoPackage = os.path.dirname(adoName) + return adoPackage + + +# make a new package directory for the test copy of ado +def makeadopackage(testfolder): + adoName = os.path.normpath(os.getcwd() + "/../adodbapi.py") + adoPath = os.path.dirname(adoName) + if os.path.exists(adoName): + newpackage = os.path.join(testfolder, "adodbapi") + try: + os.makedirs(newpackage) + except OSError: + print( + "*Note: temporary adodbapi package already exists: may be two versions running?" + ) + for f in os.listdir(adoPath): + if f.endswith(".py"): + shutil.copy(os.path.join(adoPath, f), newpackage) + return testfolder + else: + raise OSError("Cannot find source of adodbapi to test.") + + +def makemdb(testfolder, mdb_name): + # following setup code borrowed from pywin32 odbc test suite + # kindly contributed by Frank Millman. + import os + + _accessdatasource = os.path.join(testfolder, mdb_name) + if os.path.isfile(_accessdatasource): + print("using JET database=", _accessdatasource) + else: + from win32com.client import constants + from win32com.client.gencache import EnsureDispatch + + # Create a brand-new database - what is the story with these? + dbe = None + for suffix in (".36", ".35", ".30"): + try: + dbe = EnsureDispatch("DAO.DBEngine" + suffix) + break + except: + pass + if dbe: + print(" ...Creating ACCESS db at " + _accessdatasource) + workspace = dbe.Workspaces(0) + newdb = workspace.CreateDatabase( + _accessdatasource, constants.dbLangGeneral, constants.dbVersion40 + ) + newdb.Close() + else: + print(" ...copying test ACCESS db to " + _accessdatasource) + mdbName = os.path.abspath( + os.path.join(os.path.dirname(__file__), "..", "examples", "test.mdb") + ) + import shutil + + shutil.copy(mdbName, _accessdatasource) + + return _accessdatasource diff --git a/adodbapi/test/test_adodbapi_dbapi20.py b/adodbapi/test/test_adodbapi_dbapi20.py index 50f4c0f03a..201c6d8704 100644 --- a/adodbapi/test/test_adodbapi_dbapi20.py +++ b/adodbapi/test/test_adodbapi_dbapi20.py @@ -1,190 +1,190 @@ -print("This module depends on the dbapi20 compliance tests created by Stuart Bishop") -print("(see db-sig mailing list history for info)") -import platform -import sys -import unittest - -import dbapi20 -import setuptestframework - -testfolder = setuptestframework.maketemp() -if "--package" in sys.argv: - pth = setuptestframework.makeadopackage(testfolder) - sys.argv.remove("--package") -else: - pth = setuptestframework.find_ado_path() -if pth not in sys.path: - sys.path.insert(1, pth) -# function to clean up the temporary folder -- calling program must run this function before exit. -cleanup = setuptestframework.getcleanupfunction() - -import adodbapi -import adodbapi.is64bit as is64bit - -db = adodbapi - -if "--verbose" in sys.argv: - db.adodbapi.verbose = 3 - -print(adodbapi.version) -print("Tested with dbapi20 %s" % dbapi20.__version__) - -node = platform.node() - -conn_kws = {} -host = "testsql.2txt.us,1430" # if None, will use macro to fill in node name -instance = r"%s\SQLEXPRESS" -conn_kws["name"] = "adotest" - -conn_kws["user"] = "adotestuser" # None implies Windows security -conn_kws["password"] = "Sq1234567" -# macro definition for keyword "security" using macro "auto_security" -conn_kws["macro_auto_security"] = "security" - -if host is None: - conn_kws["macro_getnode"] = ["host", instance] -else: - conn_kws["host"] = host - -conn_kws["provider"] = ( - "Provider=MSOLEDBSQL;DataTypeCompatibility=80;MARS Connection=True;" -) -connStr = "%(provider)s; %(security)s; Initial Catalog=%(name)s;Data Source=%(host)s" - -if sys.platform == "win32" and node != "z-PC": - pass # default should make a local SQL Server connection -elif node == "xxx": # try Postgres database - _computername = "25.223.161.222" - _databasename = "adotest" - _username = "adotestuser" - _password = "12345678" - _driver = "PostgreSQL Unicode" - _provider = "" - connStr = "%sDriver={%s};Server=%s;Database=%s;uid=%s;pwd=%s;" % ( - _provider, - _driver, - _computername, - _databasename, - _username, - _password, - ) -elif node == "yyy": # ACCESS data base is known to fail some tests. - if is64bit.Python(): - driver = "Microsoft.ACE.OLEDB.12.0" - else: - driver = "Microsoft.Jet.OLEDB.4.0" - testmdb = setuptestframework.makemdb(testfolder) - connStr = r"Provider=%s;Data Source=%s" % (driver, testmdb) - -print(f"Using Connection String like={connStr}") -print(f"Keywords={conn_kws!r}") - - -class test_adodbapi(dbapi20.DatabaseAPI20Test): - driver = db - connect_args = (connStr,) - connect_kw_args = conn_kws - - def __init__(self, arg): - dbapi20.DatabaseAPI20Test.__init__(self, arg) - - def getTestMethodName(self): - return self.id().split(".")[-1] - - def setUp(self): - # Call superclass setUp In case this does something in the - # future - dbapi20.DatabaseAPI20Test.setUp(self) - if self.getTestMethodName() == "test_callproc": - con = self._connect() - engine = con.dbms_name - # print(f"Using database Engine={engine}") - if engine != "MS Jet": - sql = """ - create procedure templower - @theData varchar(50) - as - select lower(@theData) - """ - else: # Jet - sql = """ - create procedure templower - (theData varchar(50)) - as - select lower(theData); - """ - cur = con.cursor() - try: - cur.execute(sql) - con.commit() - except: - pass - cur.close() - con.close() - self.lower_func = "templower" - - def tearDown(self): - if self.getTestMethodName() == "test_callproc": - con = self._connect() - cur = con.cursor() - try: - cur.execute("drop procedure templower") - except: - pass - con.commit() - dbapi20.DatabaseAPI20Test.tearDown(self) - - def help_nextset_setUp(self, cur): - "Should create a procedure called deleteme" - 'that returns two result sets, first the number of rows in booze then "name from booze"' - sql = """ - create procedure deleteme as - begin - select count(*) from %sbooze - select name from %sbooze - end - """ % ( - self.table_prefix, - self.table_prefix, - ) - cur.execute(sql) - - def help_nextset_tearDown(self, cur): - "If cleaning up is needed after nextSetTest" - try: - cur.execute("drop procedure deleteme") - except: - pass - - def test_nextset(self): - con = self._connect() - try: - cur = con.cursor() - - stmts = [self.ddl1] + self._populate() - for sql in stmts: - cur.execute(sql) - - self.help_nextset_setUp(cur) - - cur.callproc("deleteme") - numberofrows = cur.fetchone() - assert numberofrows[0] == 6 - assert cur.nextset() - names = cur.fetchall() - assert len(names) == len(self.samples) - s = cur.nextset() - assert s is None, "No more return sets, should return None" - finally: - try: - self.help_nextset_tearDown(cur) - finally: - con.close() - - def test_setoutputsize(self): - pass - - -if __name__ == "__main__": - unittest.main() - cleanup(testfolder, None) +print("This module depends on the dbapi20 compliance tests created by Stuart Bishop") +print("(see db-sig mailing list history for info)") +import platform +import sys +import unittest + +import dbapi20 +import setuptestframework + +testfolder = setuptestframework.maketemp() +if "--package" in sys.argv: + pth = setuptestframework.makeadopackage(testfolder) + sys.argv.remove("--package") +else: + pth = setuptestframework.find_ado_path() +if pth not in sys.path: + sys.path.insert(1, pth) +# function to clean up the temporary folder -- calling program must run this function before exit. +cleanup = setuptestframework.getcleanupfunction() + +import adodbapi +import adodbapi.is64bit as is64bit + +db = adodbapi + +if "--verbose" in sys.argv: + db.adodbapi.verbose = 3 + +print(adodbapi.version) +print("Tested with dbapi20 %s" % dbapi20.__version__) + +node = platform.node() + +conn_kws = {} +host = "testsql.2txt.us,1430" # if None, will use macro to fill in node name +instance = r"%s\SQLEXPRESS" +conn_kws["name"] = "adotest" + +conn_kws["user"] = "adotestuser" # None implies Windows security +conn_kws["password"] = "Sq1234567" +# macro definition for keyword "security" using macro "auto_security" +conn_kws["macro_auto_security"] = "security" + +if host is None: + conn_kws["macro_getnode"] = ["host", instance] +else: + conn_kws["host"] = host + +conn_kws["provider"] = ( + "Provider=MSOLEDBSQL;DataTypeCompatibility=80;MARS Connection=True;" +) +connStr = "%(provider)s; %(security)s; Initial Catalog=%(name)s;Data Source=%(host)s" + +if sys.platform == "win32" and node != "z-PC": + pass # default should make a local SQL Server connection +elif node == "xxx": # try Postgres database + _computername = "25.223.161.222" + _databasename = "adotest" + _username = "adotestuser" + _password = "12345678" + _driver = "PostgreSQL Unicode" + _provider = "" + connStr = "%sDriver={%s};Server=%s;Database=%s;uid=%s;pwd=%s;" % ( + _provider, + _driver, + _computername, + _databasename, + _username, + _password, + ) +elif node == "yyy": # ACCESS data base is known to fail some tests. + if is64bit.Python(): + driver = "Microsoft.ACE.OLEDB.12.0" + else: + driver = "Microsoft.Jet.OLEDB.4.0" + testmdb = setuptestframework.makemdb(testfolder) + connStr = r"Provider=%s;Data Source=%s" % (driver, testmdb) + +print(f"Using Connection String like={connStr}") +print(f"Keywords={conn_kws!r}") + + +class test_adodbapi(dbapi20.DatabaseAPI20Test): + driver = db + connect_args = (connStr,) + connect_kw_args = conn_kws + + def __init__(self, arg): + dbapi20.DatabaseAPI20Test.__init__(self, arg) + + def getTestMethodName(self): + return self.id().split(".")[-1] + + def setUp(self): + # Call superclass setUp In case this does something in the + # future + dbapi20.DatabaseAPI20Test.setUp(self) + if self.getTestMethodName() == "test_callproc": + con = self._connect() + engine = con.dbms_name + # print(f"Using database Engine={engine}") + if engine != "MS Jet": + sql = """ + create procedure templower + @theData varchar(50) + as + select lower(@theData) + """ + else: # Jet + sql = """ + create procedure templower + (theData varchar(50)) + as + select lower(theData); + """ + cur = con.cursor() + try: + cur.execute(sql) + con.commit() + except: + pass + cur.close() + con.close() + self.lower_func = "templower" + + def tearDown(self): + if self.getTestMethodName() == "test_callproc": + con = self._connect() + cur = con.cursor() + try: + cur.execute("drop procedure templower") + except: + pass + con.commit() + dbapi20.DatabaseAPI20Test.tearDown(self) + + def help_nextset_setUp(self, cur): + "Should create a procedure called deleteme" + 'that returns two result sets, first the number of rows in booze then "name from booze"' + sql = """ + create procedure deleteme as + begin + select count(*) from %sbooze + select name from %sbooze + end + """ % ( + self.table_prefix, + self.table_prefix, + ) + cur.execute(sql) + + def help_nextset_tearDown(self, cur): + "If cleaning up is needed after nextSetTest" + try: + cur.execute("drop procedure deleteme") + except: + pass + + def test_nextset(self): + con = self._connect() + try: + cur = con.cursor() + + stmts = [self.ddl1] + self._populate() + for sql in stmts: + cur.execute(sql) + + self.help_nextset_setUp(cur) + + cur.callproc("deleteme") + numberofrows = cur.fetchone() + assert numberofrows[0] == 6 + assert cur.nextset() + names = cur.fetchall() + assert len(names) == len(self.samples) + s = cur.nextset() + assert s is None, "No more return sets, should return None" + finally: + try: + self.help_nextset_tearDown(cur) + finally: + con.close() + + def test_setoutputsize(self): + pass + + +if __name__ == "__main__": + unittest.main() + cleanup(testfolder, None)