Commit 59cdbce9 authored by Jack Jansen's avatar Jack Jansen

Got rid of the "enum not found" interaction, and added code to allow

overriding the creator signature.
parent 714caa0c
...@@ -33,13 +33,14 @@ def usage(): ...@@ -33,13 +33,14 @@ def usage():
--resource Parse resource file in stead of launching application (-r) --resource Parse resource file in stead of launching application (-r)
--base package Use another base package in stead of default StdSuites (-b) --base package Use another base package in stead of default StdSuites (-b)
--edit old=new Edit suite names, use empty new to skip a suite (-e) --edit old=new Edit suite names, use empty new to skip a suite (-e)
--creator code Set creator code for package (-c)
""") """)
sys.exit(1) sys.exit(1)
def main(): def main():
if len(sys.argv) > 1: if len(sys.argv) > 1:
SHORTOPTS = "rb:o:e:" SHORTOPTS = "rb:o:e:c:"
LONGOPTS = ("resource", "base=", "output=", "edit=") LONGOPTS = ("resource", "base=", "output=", "edit=", "creator=")
try: try:
opts, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS) opts, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS)
except getopt.GetoptError: except getopt.GetoptError:
...@@ -49,6 +50,7 @@ def main(): ...@@ -49,6 +50,7 @@ def main():
basepkgname = 'StdSuites' basepkgname = 'StdSuites'
output = None output = None
edit_modnames = [] edit_modnames = []
creatorsignature = None
for o, a in opts: for o, a in opts:
if o in ('-r', '--resource'): if o in ('-r', '--resource'):
...@@ -62,6 +64,12 @@ def main(): ...@@ -62,6 +64,12 @@ def main():
if len(split) != 2: if len(split) != 2:
usage() usage()
edit_modnames.append(split) edit_modnames.append(split)
if o in ('-c', '--creator'):
if len(a) != 4:
sys.stderr.write("creator must be 4-char string\n")
sys.exit(1)
creatorsignature = a
if output and len(args) > 1: if output and len(args) > 1:
sys.stderr.write("%s: cannot specify --output with multiple inputs\n" % sys.argv[0]) sys.stderr.write("%s: cannot specify --output with multiple inputs\n" % sys.argv[0])
...@@ -69,7 +77,7 @@ def main(): ...@@ -69,7 +77,7 @@ def main():
for filename in args: for filename in args:
process_func(filename, output=output, basepkgname=basepkgname, process_func(filename, output=output, basepkgname=basepkgname,
edit_modnames=edit_modnames) edit_modnames=edit_modnames, creatorsignature=creatorsignature)
else: else:
# The dialogOptionFlags below allows selection of .app bundles. # The dialogOptionFlags below allows selection of .app bundles.
filename = EasyDialogs.AskFileForOpen( filename = EasyDialogs.AskFileForOpen(
...@@ -84,7 +92,8 @@ def main(): ...@@ -84,7 +92,8 @@ def main():
print "Retry, manually parsing resources" print "Retry, manually parsing resources"
processfile_fromresource(filename) processfile_fromresource(filename)
def processfile_fromresource(fullname, output=None, basepkgname=None, edit_modnames=None): def processfile_fromresource(fullname, output=None, basepkgname=None,
edit_modnames=None, creatorsignature=None):
"""Process all resources in a single file""" """Process all resources in a single file"""
cur = CurResFile() cur = CurResFile()
print "Processing", fullname print "Processing", fullname
...@@ -112,9 +121,11 @@ def processfile_fromresource(fullname, output=None, basepkgname=None, edit_modna ...@@ -112,9 +121,11 @@ def processfile_fromresource(fullname, output=None, basepkgname=None, edit_modna
# switch back (needed for dialogs in Python) # switch back (needed for dialogs in Python)
UseResFile(cur) UseResFile(cur)
compileaetelist(aetelist, fullname, output=output, compileaetelist(aetelist, fullname, output=output,
basepkgname=basepkgname, edit_modnames=edit_modnames) basepkgname=basepkgname, edit_modnames=edit_modnames,
creatorsignature=creatorsignature)
def processfile(fullname, output=None, basepkgname=None, edit_modnames=None): def processfile(fullname, output=None, basepkgname=None,
edit_modnames=None, creatorsignature=None):
"""Ask an application for its terminology and process that""" """Ask an application for its terminology and process that"""
aedescobj, launched = OSATerminology.GetSysTerminology(fullname) aedescobj, launched = OSATerminology.GetSysTerminology(fullname)
if launched: if launched:
...@@ -128,12 +139,15 @@ def processfile(fullname, output=None, basepkgname=None, edit_modnames=None): ...@@ -128,12 +139,15 @@ def processfile(fullname, output=None, basepkgname=None, edit_modnames=None):
return return
aedata = raw[0] aedata = raw[0]
aete = decode(aedata.data) aete = decode(aedata.data)
compileaete(aete, None, fullname, output=output, basepkgname=basepkgname) compileaete(aete, None, fullname, output=output, basepkgname=basepkgname,
creatorsignature=creatorsignature)
def compileaetelist(aetelist, fullname, output=None, basepkgname=None, edit_modnames=None): def compileaetelist(aetelist, fullname, output=None, basepkgname=None,
edit_modnames=None, creatorsignature=None):
for aete, resinfo in aetelist: for aete, resinfo in aetelist:
compileaete(aete, resinfo, fullname, output=output, compileaete(aete, resinfo, fullname, output=output,
basepkgname=basepkgname, edit_modnames=edit_modnames) basepkgname=basepkgname, edit_modnames=edit_modnames,
creatorsignature=creatorsignature)
def decode(data): def decode(data):
"""Decode a resource into a python data structure""" """Decode a resource into a python data structure"""
...@@ -298,11 +312,13 @@ getaete = [ ...@@ -298,11 +312,13 @@ getaete = [
(getlist, "suites", getsuite) (getlist, "suites", getsuite)
] ]
def compileaete(aete, resinfo, fname, output=None, basepkgname=None, edit_modnames=None): def compileaete(aete, resinfo, fname, output=None, basepkgname=None,
edit_modnames=None, creatorsignature=None):
"""Generate code for a full aete resource. fname passed for doc purposes""" """Generate code for a full aete resource. fname passed for doc purposes"""
[version, language, script, suites] = aete [version, language, script, suites] = aete
major, minor = divmod(version, 256) major, minor = divmod(version, 256)
creatorsignature, dummy = MacOS.GetCreatorAndType(fname) if not creatorsignature:
creatorsignature, dummy = MacOS.GetCreatorAndType(fname)
packagename = identify(os.path.splitext(os.path.basename(fname))[0]) packagename = identify(os.path.splitext(os.path.basename(fname))[0])
if language: if language:
packagename = packagename+'_lang%d'%language packagename = packagename+'_lang%d'%language
...@@ -344,7 +360,8 @@ def compileaete(aete, resinfo, fname, output=None, basepkgname=None, edit_modnam ...@@ -344,7 +360,8 @@ def compileaete(aete, resinfo, fname, output=None, basepkgname=None, edit_modnam
suitelist.append((code, modname)) suitelist.append((code, modname))
allsuites.append(suiteinfo) allsuites.append(suiteinfo)
for suiteinfo in allsuites: for suiteinfo in allsuites:
compilesuite(suiteinfo, major, minor, language, script, fname, basepackage, allprecompinfo) compilesuite(suiteinfo, major, minor, language, script, fname, basepackage,
allprecompinfo, interact=(edit_modnames is None))
initfilename = os.path.join(output, '__init__.py') initfilename = os.path.join(output, '__init__.py')
fp = open(initfilename, 'w') fp = open(initfilename, 'w')
MacOS.SetCreatorAndType(initfilename, 'Pyth', 'TEXT') MacOS.SetCreatorAndType(initfilename, 'Pyth', 'TEXT')
...@@ -443,7 +460,7 @@ def precompilesuite(suite, basepackage=None, edit_modnames=None, output=None): ...@@ -443,7 +460,7 @@ def precompilesuite(suite, basepackage=None, edit_modnames=None, output=None):
for event in events: for event in events:
findenumsinevent(event, enumsneeded) findenumsinevent(event, enumsneeded)
objc = ObjectCompiler(None, basemodule) objc = ObjectCompiler(None, basemodule, interact=(edit_modnames is None))
for cls in classes: for cls in classes:
objc.compileclass(cls) objc.compileclass(cls)
for cls in classes: for cls in classes:
...@@ -462,7 +479,8 @@ def precompilesuite(suite, basepackage=None, edit_modnames=None, output=None): ...@@ -462,7 +479,8 @@ def precompilesuite(suite, basepackage=None, edit_modnames=None, output=None):
return code, suite, pathname, modname, precompinfo return code, suite, pathname, modname, precompinfo
def compilesuite((suite, pathname, modname), major, minor, language, script, fname, basepackage, precompinfo): def compilesuite((suite, pathname, modname), major, minor, language, script,
fname, basepackage, precompinfo, interact=1):
"""Generate code for a single suite""" """Generate code for a single suite"""
[name, desc, code, level, version, events, classes, comps, enums] = suite [name, desc, code, level, version, events, classes, comps, enums] = suite
...@@ -500,7 +518,7 @@ def compilesuite((suite, pathname, modname), major, minor, language, script, fna ...@@ -500,7 +518,7 @@ def compilesuite((suite, pathname, modname), major, minor, language, script, fna
else: else:
fp.write("\tpass\n\n") fp.write("\tpass\n\n")
objc = ObjectCompiler(fp, basemodule, precompinfo) objc = ObjectCompiler(fp, basemodule, precompinfo, interact=interact)
for cls in classes: for cls in classes:
objc.compileclass(cls) objc.compileclass(cls)
for cls in classes: for cls in classes:
...@@ -654,7 +672,7 @@ def findenumsinevent(event, enumsneeded): ...@@ -654,7 +672,7 @@ def findenumsinevent(event, enumsneeded):
# #
class CodeNameMapper: class CodeNameMapper:
def __init__(self): def __init__(self, interact=1):
self.code2name = { self.code2name = {
"property" : {}, "property" : {},
"class" : {}, "class" : {},
...@@ -669,6 +687,7 @@ class CodeNameMapper: ...@@ -669,6 +687,7 @@ class CodeNameMapper:
} }
self.modulename = None self.modulename = None
self.star_imported = 0 self.star_imported = 0
self.can_interact = interact
def addnamecode(self, type, name, code): def addnamecode(self, type, name, code):
self.name2code[type][name] = code self.name2code[type][name] = code
...@@ -712,16 +731,17 @@ class CodeNameMapper: ...@@ -712,16 +731,17 @@ class CodeNameMapper:
return self return self
class ObjectCompiler: class ObjectCompiler:
def __init__(self, fp, basesuite=None, othernamemappers=None): def __init__(self, fp, basesuite=None, othernamemappers=None, interact=1):
self.fp = fp self.fp = fp
self.basesuite = basesuite self.basesuite = basesuite
self.namemappers = [CodeNameMapper()] self.can_interact = interact
self.namemappers = [CodeNameMapper(self.can_interact)]
if othernamemappers: if othernamemappers:
self.othernamemappers = othernamemappers[:] self.othernamemappers = othernamemappers[:]
else: else:
self.othernamemappers = [] self.othernamemappers = []
if basesuite: if basesuite:
basemapper = CodeNameMapper() basemapper = CodeNameMapper(self.can_interact)
basemapper.addmodule(basesuite, '', 1) basemapper.addmodule(basesuite, '', 1)
self.namemappers.append(basemapper) self.namemappers.append(basemapper)
...@@ -755,11 +775,14 @@ class ObjectCompiler: ...@@ -755,11 +775,14 @@ class ObjectCompiler:
else: else:
m = None m = None
if not m: return None, None, None if not m: return None, None, None
mapper = CodeNameMapper() mapper = CodeNameMapper(self.can_interact)
mapper.addmodule(m, m.__name__, 0) mapper.addmodule(m, m.__name__, 0)
self.namemappers.append(mapper) self.namemappers.append(mapper)
def askdefinitionmodule(self, type, code): def askdefinitionmodule(self, type, code):
if not self.can_interact:
print "** No definition for %s '%s' found" % (type, code)
return None
path = EasyDialogs.AskFileForSave(message='Where is %s %s declared?'%(type, code)) path = EasyDialogs.AskFileForSave(message='Where is %s %s declared?'%(type, code))
if not path: return if not path: return
path, file = os.path.split(path) path, file = os.path.split(path)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment