Allow gensuitemodule to be run non-interactively, from the OSX command

line. 90% of the work is done, missing enums still cause a dialog to appear.
This commit is contained in:
Jack Jansen 2003-03-21 16:07:39 +00:00
parent dd42edcc9d
commit 714caa0c35
1 changed files with 79 additions and 22 deletions

View File

@ -20,15 +20,56 @@ import distutils.sysconfig
import OSATerminology import OSATerminology
from Carbon.Res import * from Carbon.Res import *
import MacOS import MacOS
import getopt
_MAC_LIB_FOLDER=os.path.dirname(aetools.__file__) _MAC_LIB_FOLDER=os.path.dirname(aetools.__file__)
DEFAULT_STANDARD_PACKAGEFOLDER=os.path.join(_MAC_LIB_FOLDER, 'lib-scriptpackages') DEFAULT_STANDARD_PACKAGEFOLDER=os.path.join(_MAC_LIB_FOLDER, 'lib-scriptpackages')
DEFAULT_USER_PACKAGEFOLDER=distutils.sysconfig.get_python_lib() DEFAULT_USER_PACKAGEFOLDER=distutils.sysconfig.get_python_lib()
def usage():
sys.stderr.write("Usage: %s [opts] application-or-resource-file\n" % sys.argv[0])
sys.stderr.write("""Options:
--output pkgdir Pathname of the output package (short: -o)
--resource Parse resource file in stead of launching application (-r)
--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)
""")
sys.exit(1)
def main(): def main():
if len(sys.argv) > 1: if len(sys.argv) > 1:
for filename in sys.argv[1:]: SHORTOPTS = "rb:o:e:"
processfile(filename) LONGOPTS = ("resource", "base=", "output=", "edit=")
try:
opts, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS)
except getopt.GetoptError:
usage()
process_func = processfile
basepkgname = 'StdSuites'
output = None
edit_modnames = []
for o, a in opts:
if o in ('-r', '--resource'):
process_func = processfile_fromresource
if o in ('-b', '--base'):
basepkgname = a
if o in ('-o', '--output'):
output = a
if o in ('-e', '--edit'):
split = a.split('=')
if len(split) != 2:
usage()
edit_modnames.append(split)
if output and len(args) > 1:
sys.stderr.write("%s: cannot specify --output with multiple inputs\n" % sys.argv[0])
sys.exit(1)
for filename in args:
process_func(filename, output=output, basepkgname=basepkgname,
edit_modnames=edit_modnames)
else: else:
# The dialogOptionFlags below allows selection of .app bundles. # The dialogOptionFlags below allows selection of .app bundles.
filename = EasyDialogs.AskFileForOpen( filename = EasyDialogs.AskFileForOpen(
@ -43,7 +84,7 @@ def main():
print "Retry, manually parsing resources" print "Retry, manually parsing resources"
processfile_fromresource(filename) processfile_fromresource(filename)
def processfile_fromresource(fullname): def processfile_fromresource(fullname, output=None, basepkgname=None, edit_modnames=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
@ -70,9 +111,10 @@ def processfile_fromresource(fullname):
UseResFile(cur) UseResFile(cur)
# switch back (needed for dialogs in Python) # switch back (needed for dialogs in Python)
UseResFile(cur) UseResFile(cur)
compileaetelist(aetelist, fullname) compileaetelist(aetelist, fullname, output=output,
basepkgname=basepkgname, edit_modnames=edit_modnames)
def processfile(fullname): def processfile(fullname, output=None, basepkgname=None, edit_modnames=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:
@ -86,11 +128,12 @@ def processfile(fullname):
return return
aedata = raw[0] aedata = raw[0]
aete = decode(aedata.data) aete = decode(aedata.data)
compileaete(aete, None, fullname) compileaete(aete, None, fullname, output=output, basepkgname=basepkgname)
def compileaetelist(aetelist, fullname): def compileaetelist(aetelist, fullname, output=None, basepkgname=None, edit_modnames=None):
for aete, resinfo in aetelist: for aete, resinfo in aetelist:
compileaete(aete, resinfo, fullname) compileaete(aete, resinfo, fullname, output=output,
basepkgname=basepkgname, edit_modnames=edit_modnames)
def decode(data): def decode(data):
"""Decode a resource into a python data structure""" """Decode a resource into a python data structure"""
@ -255,7 +298,7 @@ getaete = [
(getlist, "suites", getsuite) (getlist, "suites", getsuite)
] ]
def compileaete(aete, resinfo, fname): def compileaete(aete, resinfo, fname, output=None, basepkgname=None, edit_modnames=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)
@ -267,16 +310,23 @@ def compileaete(aete, resinfo, fname):
packagename = packagename+'_script%d'%script packagename = packagename+'_script%d'%script
if len(packagename) > 27: if len(packagename) > 27:
packagename = packagename[:27] packagename = packagename[:27]
if output:
# XXXX Put this in site-packages if it isn't a full pathname?
if not os.path.exists(output):
os.mkdir(output)
pathname = output
else:
pathname = EasyDialogs.AskFolder(message='Create and select package folder for %s'%packagename, pathname = EasyDialogs.AskFolder(message='Create and select package folder for %s'%packagename,
defaultLocation=DEFAULT_USER_PACKAGEFOLDER) defaultLocation=DEFAULT_USER_PACKAGEFOLDER)
if not pathname: if not pathname:
return return
packagename = os.path.split(os.path.normpath(pathname))[1] packagename = os.path.split(os.path.normpath(pathname))[1]
if not basepkgname:
basepkgname = EasyDialogs.AskFolder(message='Package folder for base suite (usually StdSuites)', basepkgname = EasyDialogs.AskFolder(message='Package folder for base suite (usually StdSuites)',
defaultLocation=DEFAULT_STANDARD_PACKAGEFOLDER) defaultLocation=DEFAULT_STANDARD_PACKAGEFOLDER)
if basepkgname: if basepkgname:
dirname, basepkgname = os.path.split(os.path.normpath(basepkgname)) dirname, basepkgname = os.path.split(os.path.normpath(basepkgname))
if not dirname in sys.path: if dirname and not dirname in sys.path:
sys.path.insert(0, dirname) sys.path.insert(0, dirname)
basepackage = __import__(basepkgname) basepackage = __import__(basepkgname)
else: else:
@ -285,7 +335,8 @@ def compileaete(aete, resinfo, fname):
allprecompinfo = [] allprecompinfo = []
allsuites = [] allsuites = []
for suite in suites: for suite in suites:
code, suite, pathname, modname, precompinfo = precompilesuite(suite, basepackage) code, suite, pathname, modname, precompinfo = precompilesuite(suite, basepackage,
output=output, edit_modnames=edit_modnames)
if not code: if not code:
continue continue
allprecompinfo = allprecompinfo + precompinfo allprecompinfo = allprecompinfo + precompinfo
@ -294,10 +345,7 @@ def compileaete(aete, resinfo, fname):
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)
initfilename = EasyDialogs.AskFileForSave(message='Package module', initfilename = os.path.join(output, '__init__.py')
savedFileName='__init__.py')
if not initfilename:
return
fp = open(initfilename, 'w') fp = open(initfilename, 'w')
MacOS.SetCreatorAndType(initfilename, 'Pyth', 'TEXT') MacOS.SetCreatorAndType(initfilename, 'Pyth', 'TEXT')
fp.write('"""\n') fp.write('"""\n')
@ -358,7 +406,7 @@ def compileaete(aete, resinfo, fname):
fp.write("\t_moduleName = '%s'\n\n"%packagename) fp.write("\t_moduleName = '%s'\n\n"%packagename)
fp.close() fp.close()
def precompilesuite(suite, basepackage=None): def precompilesuite(suite, basepackage=None, edit_modnames=None, output=None):
"""Parse a single suite without generating the output. This step is needed """Parse a single suite without generating the output. This step is needed
so we can resolve recursive references by suites to enums/comps/etc declared so we can resolve recursive references by suites to enums/comps/etc declared
in other suites""" in other suites"""
@ -367,8 +415,17 @@ def precompilesuite(suite, basepackage=None):
modname = identify(name) modname = identify(name)
if len(modname) > 28: if len(modname) > 28:
modname = modname[:27] modname = modname[:27]
if edit_modnames is None:
pathname = EasyDialogs.AskFileForSave(message='Python output file', pathname = EasyDialogs.AskFileForSave(message='Python output file',
savedFileName=modname+'.py') savedFileName=modname+'.py')
else:
for old, new in edit_modnames:
if old == modname:
modname = new
if modname:
pathname = os.path.join(output, modname + '.py')
else:
pathname = None
if not pathname: if not pathname:
return None, None, None, None, None return None, None, None, None, None