[Python-checkins] python/dist/src/Lib/plat-mac gensuitemodule.py,1.2,1.3

jackjansen@users.sourceforge.net jackjansen@users.sourceforge.net
Tue, 01 Apr 2003 05:32:20 -0800


Update of /cvsroot/python/python/dist/src/Lib/plat-mac
In directory sc8-pr-cvs1:/tmp/cvs-serv6654

Modified Files:
	gensuitemodule.py 
Log Message:
- All messages are now dependent on the --verbose option.
- Added a --dump option that doesn't generate the module but dumps
  the pretty-printed aete resource(s) on stdout.


Index: gensuitemodule.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/plat-mac/gensuitemodule.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** gensuitemodule.py	30 Mar 2003 22:39:39 -0000	1.2
--- gensuitemodule.py	1 Apr 2003 13:32:17 -0000	1.3
***************
*** 37,40 ****
--- 37,42 ----
  --edit old=new   Edit suite names, use empty new to skip a suite (-e)
  --creator code   Set creator code for package (-c)
+ --dump           Dump aete resource to stdout in stead of creating module (-d)
+ --verbose        Tell us what happens (-v)
  """)
  	sys.exit(1)
***************
*** 42,47 ****
  def main():
  	if len(sys.argv) > 1:
! 		SHORTOPTS = "rb:o:e:c:"
! 		LONGOPTS = ("resource", "base=", "output=", "edit=", "creator=")
  		try:
  			opts, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS)
--- 44,49 ----
  def main():
  	if len(sys.argv) > 1:
! 		SHORTOPTS = "rb:o:e:c:dv"
! 		LONGOPTS = ("resource", "base=", "output=", "edit=", "creator=", "dump", "verbose")
  		try:
  			opts, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS)
***************
*** 54,57 ****
--- 56,61 ----
  		edit_modnames = []
  		creatorsignature = None
+ 		dump = None
+ 		verbose = None
  		
  		for o, a in opts:
***************
*** 72,75 ****
--- 76,83 ----
  					sys.exit(1)
  				creatorsignature = a
+ 			if o in ('-d', '--dump'):
+ 				dump = sys.stdout
+ 			if o in ('-v', '--verbose'):
+ 				verbose = sys.stderr
  				
  					
***************
*** 80,84 ****
  		for filename in args:
  			process_func(filename, output=output, basepkgname=basepkgname, 
! 				edit_modnames=edit_modnames, creatorsignature=creatorsignature)
  	else:
  		main_interactive()
--- 88,93 ----
  		for filename in args:
  			process_func(filename, output=output, basepkgname=basepkgname, 
! 				edit_modnames=edit_modnames, creatorsignature=creatorsignature,
! 				dump=dump, verbose=verbose)
  	else:
  		main_interactive()
***************
*** 104,113 ****
  			return
  	try:
! 		processfile(filename, edit_modnames=edit_modnames, basepkgname=basepkgname)
  	except MacOS.Error, arg:
  		print "Error getting terminology:", arg
  		print "Retry, manually parsing resources"
  		processfile_fromresource(filename, edit_modnames=edit_modnames,
! 			basepkgname=basepkgname)
  			
  def is_scriptable(application):
--- 113,123 ----
  			return
  	try:
! 		processfile(filename, edit_modnames=edit_modnames, basepkgname=basepkgname,
! 		verbose=sys.stderr)
  	except MacOS.Error, arg:
  		print "Error getting terminology:", arg
  		print "Retry, manually parsing resources"
  		processfile_fromresource(filename, edit_modnames=edit_modnames,
! 			basepkgname=basepkgname, verbose=sys.stderr)
  			
  def is_scriptable(application):
***************
*** 133,142 ****
  
  def processfile_fromresource(fullname, output=None, basepkgname=None, 
! 		edit_modnames=None, creatorsignature=None):
  	"""Process all resources in a single file"""
! 	if not is_scriptable(fullname):
! 		print "Warning: app does not seem scriptable: %s" % fullname
  	cur = CurResFile()
! 	print "Processing", fullname
  	rf = macresource.open_pathname(fullname)
  	try:
--- 143,153 ----
  
  def processfile_fromresource(fullname, output=None, basepkgname=None, 
! 		edit_modnames=None, creatorsignature=None, dump=None, verbose=None):
  	"""Process all resources in a single file"""
! 	if not is_scriptable(fullname) and verbose:
! 		print >>verbose, "Warning: app does not seem scriptable: %s" % fullname
  	cur = CurResFile()
! 	if verbose:
! 		print >>verbose, "Processing", fullname
  	rf = macresource.open_pathname(fullname)
  	try:
***************
*** 149,158 ****
  			res = Get1IndResource('aeut', 1+i)
  			resources.append(res)
! 		print "\nLISTING aete+aeut RESOURCES IN", `fullname`
  		aetelist = []
  		for res in resources:
! 			print "decoding", res.GetResInfo(), "..."
  			data = res.data
! 			aete = decode(data)
  			aetelist.append((aete, res.GetResInfo()))
  	finally:
--- 160,171 ----
  			res = Get1IndResource('aeut', 1+i)
  			resources.append(res)
! 		if verbose:	
! 			print >>verbose, "\nLISTING aete+aeut RESOURCES IN", `fullname`
  		aetelist = []
  		for res in resources:
! 			if verbose:
! 				print >>verbose, "decoding", res.GetResInfo(), "..."
  			data = res.data
! 			aete = decode(data, verbose)
  			aetelist.append((aete, res.GetResInfo()))
  	finally:
***************
*** 162,181 ****
  	# switch back (needed for dialogs in Python)
  	UseResFile(cur)
  	compileaetelist(aetelist, fullname, output=output, 
  		basepkgname=basepkgname, edit_modnames=edit_modnames,
! 		creatorsignature=creatorsignature)
  
  def processfile(fullname, output=None, basepkgname=None, 
! 		edit_modnames=None, creatorsignature=None):
  	"""Ask an application for its terminology and process that"""
! 	if not is_scriptable(fullname):
! 		print "Warning: app does not seem scriptable: %s" % fullname
! 	print "\nASKING FOR aete DICTIONARY IN", `fullname`
  	try:
  		aedescobj, launched = OSATerminology.GetAppTerminology(fullname)
  	except MacOS.Error, arg:
  		if arg[0] in (-1701, -192): # errAEDescNotFound, resNotFound
! 			print "GetAppTerminology failed with errAEDescNotFound/resNotFound, trying manually"
! 			aedata, sig = getappterminology(fullname)
  			if not creatorsignature:
  				creatorsignature = sig
--- 175,199 ----
  	# switch back (needed for dialogs in Python)
  	UseResFile(cur)
+ 	if dump:
+ 		dumpaetelist(aetelist, dump)
  	compileaetelist(aetelist, fullname, output=output, 
  		basepkgname=basepkgname, edit_modnames=edit_modnames,
! 		creatorsignature=creatorsignature, verbose=verbose)
  
  def processfile(fullname, output=None, basepkgname=None, 
! 		edit_modnames=None, creatorsignature=None, dump=None,
! 		verbose=None):
  	"""Ask an application for its terminology and process that"""
! 	if not is_scriptable(fullname) and verbose:
! 		print >>verbose, "Warning: app does not seem scriptable: %s" % fullname
! 	if verbose:
! 		print >>verbose, "\nASKING FOR aete DICTIONARY IN", `fullname`
  	try:
  		aedescobj, launched = OSATerminology.GetAppTerminology(fullname)
  	except MacOS.Error, arg:
  		if arg[0] in (-1701, -192): # errAEDescNotFound, resNotFound
! 			if verbose:
! 				print >>verbose, "GetAppTerminology failed with errAEDescNotFound/resNotFound, trying manually"
! 			aedata, sig = getappterminology(fullname, verbose=verbose)
  			if not creatorsignature:
  				creatorsignature = sig
***************
*** 184,201 ****
  	else:
  		if launched:
! 			print "Launched", fullname
  		raw = aetools.unpack(aedescobj)
  		if not raw: 
! 			print 'Unpack returned empty value:', raw
  			return
! 		if not raw[0].data: 
! 			print 'Unpack returned value without data:', raw
  			return
  		aedata = raw[0]
! 	aete = decode(aedata.data)
  	compileaete(aete, None, fullname, output=output, basepkgname=basepkgname,
! 		creatorsignature=creatorsignature, edit_modnames=edit_modnames)
  		
! def getappterminology(fullname):
  	"""Get application terminology by sending an AppleEvent"""
  	# First check that we actually can send AppleEvents
--- 202,226 ----
  	else:
  		if launched:
! 			if verbose:
! 				print >>verbose, "Launched", fullname
  		raw = aetools.unpack(aedescobj)
  		if not raw: 
! 			if verbose:
! 				print >>verbose, 'Unpack returned empty value:', raw
  			return
! 		if not raw[0].data:
! 			if verbose:
! 				print >>verbose, 'Unpack returned value without data:', raw
  			return
  		aedata = raw[0]
! 	aete = decode(aedata.data, verbose)
! 	if dump:
! 		dumpaetelist([aete], dump)
! 		return
  	compileaete(aete, None, fullname, output=output, basepkgname=basepkgname,
! 		creatorsignature=creatorsignature, edit_modnames=edit_modnames, 
! 		verbose=verbose)
  		
! def getappterminology(fullname, verbose=None):
  	"""Get application terminology by sending an AppleEvent"""
  	# First check that we actually can send AppleEvents
***************
*** 221,225 ****
  		talker._start()
  	except (MacOS.Error, aetools.Error), arg:
! 		print 'Warning: start() failed, continuing anyway:', arg
  	reply = talker.send("ascr", "gdte")
  	#reply2 = talker.send("ascr", "gdut")
--- 246,251 ----
  		talker._start()
  	except (MacOS.Error, aetools.Error), arg:
! 		if verbose:
! 			print >>verbose, 'Warning: start() failed, continuing anyway:', arg
  	reply = talker.send("ascr", "gdte")
  	#reply2 = talker.send("ascr", "gdut")
***************
*** 229,239 ****
  
  def compileaetelist(aetelist, fullname, output=None, basepkgname=None, 
! 			edit_modnames=None, creatorsignature=None):
  	for aete, resinfo in aetelist:
  		compileaete(aete, resinfo, fullname, output=output, 
  			basepkgname=basepkgname, edit_modnames=edit_modnames,
! 			creatorsignature=creatorsignature)
! 		
! def decode(data):
  	"""Decode a resource into a python data structure"""
  	f = StringIO.StringIO(data)
--- 255,269 ----
  
  def compileaetelist(aetelist, fullname, output=None, basepkgname=None, 
! 			edit_modnames=None, creatorsignature=None, verbose=None):
  	for aete, resinfo in aetelist:
  		compileaete(aete, resinfo, fullname, output=output, 
  			basepkgname=basepkgname, edit_modnames=edit_modnames,
! 			creatorsignature=creatorsignature, verbose=verbose)
! 
! def dumpaetelist(aetelist, output):
! 	import pprint
! 	pprint.pprint(aetelist, output)
! 	
! def decode(data, verbose=None):
  	"""Decode a resource into a python data structure"""
  	f = StringIO.StringIO(data)
***************
*** 243,248 ****
  	unprocessed = len(f.read())
  	total = f.tell()
! 	if unprocessed:
! 		sys.stderr.write("%d processed + %d unprocessed = %d total\n" %
  		                 (processed, unprocessed, total))
  	return aete
--- 273,278 ----
  	unprocessed = len(f.read())
  	total = f.tell()
! 	if unprocessed and verbose:
! 		verbose.write("%d processed + %d unprocessed = %d total\n" %
  		                 (processed, unprocessed, total))
  	return aete
***************
*** 399,403 ****
  
  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"""
  	[version, language, script, suites] = aete
--- 429,433 ----
  
  def compileaete(aete, resinfo, fname, output=None, basepkgname=None, 
! 		edit_modnames=None, creatorsignature=None, verbose=None):
  	"""Generate code for a full aete resource. fname passed for doc purposes"""
  	[version, language, script, suites] = aete
***************
*** 439,443 ****
  	for suite in suites:
  		code, suite, pathname, modname, precompinfo = precompilesuite(suite, basepackage, 
! 				output=output, edit_modnames=edit_modnames)
  		if not code:
  			continue
--- 469,473 ----
  	for suite in suites:
  		code, suite, pathname, modname, precompinfo = precompilesuite(suite, basepackage, 
! 				output=output, edit_modnames=edit_modnames, verbose=verbose)
  		if not code:
  			continue
***************
*** 448,452 ****
  	for suiteinfo in allsuites:
  		compilesuite(suiteinfo, major, minor, language, script, fname, basepackage, 
! 				allprecompinfo, interact=(edit_modnames is None))
  	initfilename = os.path.join(output, '__init__.py')
  	fp = open(initfilename, 'w')
--- 478,482 ----
  	for suiteinfo in allsuites:
  		compilesuite(suiteinfo, major, minor, language, script, fname, basepackage, 
! 				allprecompinfo, interact=(edit_modnames is None), verbose=verbose)
  	initfilename = os.path.join(output, '__init__.py')
  	fp = open(initfilename, 'w')
***************
*** 512,516 ****
  	fp.close()
  	
! def precompilesuite(suite, basepackage=None, edit_modnames=None, output=None):
  	"""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
--- 542,547 ----
  	fp.close()
  	
! def precompilesuite(suite, basepackage=None, edit_modnames=None, output=None,
! 		verbose=None):
  	"""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
***************
*** 549,553 ****
  		findenumsinevent(event, enumsneeded)
  
! 	objc = ObjectCompiler(None, basemodule, interact=(edit_modnames is None))
  	for cls in classes:
  		objc.compileclass(cls)
--- 580,585 ----
  		findenumsinevent(event, enumsneeded)
  
! 	objc = ObjectCompiler(None, basemodule, interact=(edit_modnames is None),
! 		verbose=verbose)
  	for cls in classes:
  		objc.compileclass(cls)
***************
*** 569,573 ****
  
  def compilesuite((suite, pathname, modname), major, minor, language, script, 
! 		fname, basepackage, precompinfo, interact=1):
  	"""Generate code for a single suite"""
  	[name, desc, code, level, version, events, classes, comps, enums] = suite
--- 601,605 ----
  
  def compilesuite((suite, pathname, modname), major, minor, language, script, 
! 		fname, basepackage, precompinfo, interact=1, verbose=None):
  	"""Generate code for a single suite"""
  	[name, desc, code, level, version, events, classes, comps, enums] = suite
***************
*** 625,629 ****
  		fp.write("\tpass\n\n")
  
! 	objc = ObjectCompiler(fp, basemodule, precompinfo, interact=interact)
  	for cls in classes:
  		objc.compileclass(cls)
--- 657,662 ----
  		fp.write("\tpass\n\n")
  
! 	objc = ObjectCompiler(fp, basemodule, precompinfo, interact=interact,
! 		verbose=verbose)
  	for cls in classes:
  		objc.compileclass(cls)
***************
*** 779,783 ****
  class CodeNameMapper:
  	
! 	def __init__(self, interact=1):
  		self.code2name = {
  			"property" : {},
--- 812,816 ----
  class CodeNameMapper:
  	
! 	def __init__(self, interact=1, verbose=None):
  		self.code2name = {
  			"property" : {},
***************
*** 795,798 ****
--- 828,832 ----
  		self.star_imported = 0
  		self.can_interact = interact
+ 		self.verbose = verbose
  		
  	def addnamecode(self, type, name, code):
***************
*** 838,846 ****
  			
  class ObjectCompiler:
! 	def __init__(self, fp, basesuite=None, othernamemappers=None, interact=1):
  		self.fp = fp
  		self.basesuite = basesuite
  		self.can_interact = interact
! 		self.namemappers = [CodeNameMapper(self.can_interact)]
  		if othernamemappers:
  			self.othernamemappers = othernamemappers[:]
--- 872,882 ----
  			
  class ObjectCompiler:
! 	def __init__(self, fp, basesuite=None, othernamemappers=None, interact=1, 
! 			verbose=None):
  		self.fp = fp
+ 		self.verbose = verbose
  		self.basesuite = basesuite
  		self.can_interact = interact
! 		self.namemappers = [CodeNameMapper(self.can_interact, self.verbose)]
  		if othernamemappers:
  			self.othernamemappers = othernamemappers[:]
***************
*** 848,852 ****
  			self.othernamemappers = []
  		if basesuite:
! 			basemapper = CodeNameMapper(self.can_interact)
  			basemapper.addmodule(basesuite, '', 1)
  			self.namemappers.append(basemapper)
--- 884,888 ----
  			self.othernamemappers = []
  		if basesuite:
! 			basemapper = CodeNameMapper(self.can_interact, self.verbose)
  			basemapper.addmodule(basesuite, '', 1)
  			self.namemappers.append(basemapper)
***************
*** 882,886 ****
  					m = None
  				if not m: return None, None, None
! 				mapper = CodeNameMapper(self.can_interact)
  				mapper.addmodule(m, m.__name__, 0)
  				self.namemappers.append(mapper)
--- 918,922 ----
  					m = None
  				if not m: return None, None, None
! 				mapper = CodeNameMapper(self.can_interact, self.verbose)
  				mapper.addmodule(m, m.__name__, 0)
  				self.namemappers.append(mapper)
***************
*** 888,892 ****
  	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))
--- 924,929 ----
  	def askdefinitionmodule(self, type, code):
  		if not self.can_interact:
! 			if self.verbose:
! 				print >>self.verbose, "** No definition for %s '%s' found" % (type, code)
  			return None
  		path = EasyDialogs.AskFileForSave(message='Where is %s %s declared?'%(type, code))
***************
*** 955,959 ****
  			if self.fp and (elements or len(properties) > 1 or (len(properties) == 1 and
  				properties[0][1] != 'c@#!')):
! 				print '** Skip multiple %s of %s (code %s)' % (cname, self.namemappers[0].findcodename('class', code)[0], `code`)
  				raise RuntimeError, "About to skip non-empty class"
  			return
--- 992,997 ----
  			if self.fp and (elements or len(properties) > 1 or (len(properties) == 1 and
  				properties[0][1] != 'c@#!')):
! 				if self.verbose:
! 					print >>self.verbose, '** Skip multiple %s of %s (code %s)' % (cname, self.namemappers[0].findcodename('class', code)[0], `code`)
  				raise RuntimeError, "About to skip non-empty class"
  			return