RIP:GmstTweaker:

Imports fix:

---------- Mopy/bash/patcher/oblivion/patchers/multitweak_settings.py ----------
index a7d50fc..d9dc98c 100644
@@ -27,7 +27,8 @@
 for game settings, said the oracle at Delphi.""" # TODO:DOCS
-from bolt import SubProgress, StateError
-from bosh import MultiTweaker, CBash_MultiTweaker
-from brec import MreRecord, ModReader
-import bush
-from patcher.oblivion.patchers.base import MultiTweakItem, CBash_MultiTweakItem
+from bash.bolt import SubProgress, StateError, deprint
+from bash.bosh import MultiTweaker, CBash_MultiTweaker
+from bash.brec import MreRecord, ModReader
+import bash.bush
+from bash.patcher.oblivion.patchers.base import MultiTweakItem, \
+    CBash_MultiTweakItem

@@ -82,3 +83,3 @@ def buildPatch(self,patchFile,keep,log):
         eids = ((self.key,),self.key)[isinstance(self.key,tuple)]
-        isOblivion = bush.game.fsName.lower() == u'oblivion'
+        isOblivion = bash.bush.game.fsName.lower() == u'oblivion'
         for eid,value in zip(eids,self.choiceValues[self.chosen]):
@@ -196,4 +197,4 @@ def getConfig(self,configs):
         tweaksAppend = self.tweaks.append
-        for cls,tweaks in [(GlobalsTweak,bush.game.GlobalsTweaks),
-                           (GmstTweak,bush.game.GmstTweaks)]:
+        for cls,tweaks in [(GlobalsTweak,bash.bush.game.GlobalsTweaks),
+                           (GmstTweak,bash.bush.game.GmstTweaks)]:
             for tweak in tweaks:
@@ -257,4 +258,4 @@ def getConfig(self,configs):
         tweaksAppend = self.tweaks.append
-        for cls,tweaks in [(CBash_GlobalsTweak,bush.game.GlobalsTweaks),
-                           (CBash_GmstTweak,bush.game.GmstTweaks)]:
+        for cls,tweaks in [(CBash_GlobalsTweak,bash.bush.game.GlobalsTweaks),
+                           (CBash_GmstTweak,bash.bush.game.GmstTweaks)]:
             for tweak in tweaks:
GmstTweaker: Warns, wrapping
RIP: ClothesTweaker
ClothesTweaker: Warns, wrap
RIP:TweakActors, this completes Patchers30
RIP:RacePatcher - Unwrapped:

Imports fix (+ some wrapping):

----------- Mopy/bash/patcher/oblivion/patchers/races_multitweaks.py -----------
index 0fa7417..8315fdc 100644
@@ -32,10 +32,11 @@
 import re
-from bolt import SubProgress, BoltError, GPath, deprint
-from bosh import SpecialPatcher, DoublePatcher, PatchFile, LoadFactory, ModFile, \
-    CBash_DoublePatcher, CBash_ListPatcher
-from brec import MreRecord, MelObject, strFid
-import bush
-from cint import ValidateDict, FormID
-from patcher.base import AMultiTweakItem, Patcher
-from patcher.oblivion.patchers.base import MultiTweakItem, CBash_MultiTweakItem
+from bash.bolt import SubProgress, BoltError, GPath, deprint
+from bash.bosh import SpecialPatcher, DoublePatcher, PatchFile, LoadFactory, \
+    ModFile, CBash_DoublePatcher, CBash_ListPatcher
+from bash.brec import MreRecord, MelObject, strFid
+import bash.bush
+from bash.cint import ValidateDict, FormID
+from bash.patcher.base import AMultiTweakItem, Patcher
+from bash.patcher.oblivion.patchers.base import MultiTweakItem, \
+    CBash_MultiTweakItem
 # FIXME : move SpecialPatcher, DoublePatcher, CBash_DoublePatcher,
@@ -737,3 +738,4 @@ def getAutoItems(self):
             if autoRe.match(modInfo.name.s) or (autoKey & set(modInfo.getBashTags())):
-                if bush.fullLoadOrder[modInfo.name] > bush.fullLoadOrder[PatchFile.patchName]: continue
+                if bash.bush.fullLoadOrder[modInfo.name] > \
+                        bash.bush.fullLoadOrder[PatchFile.patchName]: continue
                 autoItems.append(modInfo.name)
@@ -1086,3 +1088,5 @@ def setRaceEyeMesh(race,rightPath,leftPath):
             if (race.flags.playable or race.fid == (GPath(u'Oblivion.esm'), 0x038010)) and race.eyes:
-                defaultEyes[race.fid] = [x for x in bush.defaultEyes.get(race.fid,[]) if x in race.eyes]
+                defaultEyes[race.fid] = [x for x in
+                                         bash.bush.defaultEyes.get(race.fid,
+                                             []) if x in race.eyes]
                 if not defaultEyes[race.fid]:
@@ -1576,5 +1580,11 @@ def setRaceEyeMesh(race,rightPath,leftPath):
                             raceChanged = True
-                        defaultEyes[recordId] = [x for x in bush.defaultEyes.get(recordId,[]) if x in currentEyes] or currentEyes
-                        defaultMaleHair[recordId] = [x for x in currentHairs if x in maleHairs]
-                        defaultFemaleHair[recordId] = [x for x in currentHairs if x in femaleHairs]
+                        defaultEyes[recordId] = [x for x in
+                                                 bash.bush.defaultEyes.get(
+                                                     recordId, []) if
+                                                 x in currentEyes] or \
+                                                currentEyes
+                        defaultMaleHair[recordId] = [x for x in currentHairs if
+                                                     x in maleHairs]
+                        defaultFemaleHair[recordId] = [x for x in currentHairs
+                                                       if x in femaleHairs]
RacePatcher: Wrapping, warnings

Took all day
[bosh]Warn: set creation replaced with literal
[bosh]Warn: redundant parentheses
[bosh]Warn: assignment replaced with augmented assignment
Nitpick:

Typos, wrap, newlines, also proper CamelCase (ARaceTweaker_BiggerOrcsandNords)
[Common code]AVORB_NPCSkeletonPatcher._initSkeletonCollections()
C/P MultiTweaker in patcher/oblivion/patchers/base.py
C/P DoublePatcher in Mopy/bash/patcher/oblivion/patchers/base.py

And ADoublePatcher in Mopy/bash/patcher/base.py
C/P AliasesPatcher in Mopy/bash/patcher/oblivion/patchers/base.py
C/P ListPatcher in Mopy/bash/patcher/oblivion/patchers/base.py
Comments and changes in base.py:

- raising in buildPatch() turns out it aborts the patch. Some patcher does not
 override buildPatch - strange. Did not track him
- initData() moved to Patcher from _Abstract_Patcher. CBash_Patcher.initData()
 has 3 not 2 args.
Merge branch 'utumno-patchers-rip-1' into dev

Under #3

Multitweaks, multitweakers and race patchers moved out of bosh.py.
This merge begins the actual rip of the patchers out of bosh.
See b662187ea2baac8743ad45a87f7cf3fc62decced for comments on the layout - in
short it is __temporary__.

Commits that need review:

- b662187ea2baac8743ad45a87f7cf3fc62decced: bosh.dirs, layout notes
- aa2cc6e161cbf97b610d3ad7e2da660eb8edf760: CORSPE (sic)
- 39870ae77e013db9c53f6cf4b2a5a72ccd2741c7: comments commit
Method _patchLog() moved from AMultiTweakItem to MultiTweakItem:

Not a final change but it is cleaner now.
C/P MultiTweakItem got methods from C/P Patcher classes

Still same questions as in patchers/base - would it make any sense to make
 getRead/WriteClasses() into classmethods ?

 # This is the 2nd commit message:

apply(self,modFile,record,bashTags) -> (self,modFile,record)

 # This is the 3rd commit message:

Revert "apply(self,modFile,record,bashTags) -> (self,modFile,record)"

This reverts commit e0504690814051ed4d2175d0b6a20c8010b2f424.
Can't readily find where apply() is called - I want apply to have 3 arguments
(since the fourth is never used) but it'll have to wait

Traceback (most recent call last):
  File "bash\basher.py", line 6958, in Execute
  File "bash\bosh.py", line 11024, in buildPatch
TypeError: apply() takes exactly 3 arguments (4 given)