[Python-checkins] python/dist/src/Mac/scripts gensuitemodule.py,1.23,1.24

jackjansen@users.sourceforge.net jackjansen@users.sourceforge.net
Wed, 07 Aug 2002 07:49:02 -0700


Update of /cvsroot/python/python/dist/src/Mac/scripts
In directory usw-pr-cvs1:/tmp/cvs-serv13794/scripts

Modified Files:
	gensuitemodule.py 
Log Message:
Donovan Preston's patch #538395, with some mods by me.

This patch makes inheritance for OSA classes work. The implementation is a
bit convoluted, but I don't immedeately see a simpler way of doing it.

I added calls to ascii() everywhere we output strings that may contain
non-ascii characters (Python has gotten very picky since the encoding
patch:-).

I also removed Donovan's different way of opening resource files: I don't
seem to need it.


Index: gensuitemodule.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Mac/scripts/gensuitemodule.py,v
retrieving revision 1.23
retrieving revision 1.24
diff -C2 -d -r1.23 -r1.24
*** gensuitemodule.py	23 Apr 2002 21:03:21 -0000	1.23
--- gensuitemodule.py	7 Aug 2002 14:49:00 -0000	1.24
***************
*** 16,19 ****
--- 16,20 ----
  import keyword
  import macresource
+ from aetools import unpack
  
  from Carbon.Res import *
***************
*** 275,279 ****
  	fp.write('"""\n')
  	fp.write("Package generated from %s\n"%fname)
! 	fp.write("Resource %s resid %d %s\n"%(resinfo[1], resinfo[0], resinfo[2]))
  	fp.write('"""\n')
  	fp.write('import aetools\n')
--- 276,281 ----
  	fp.write('"""\n')
  	fp.write("Package generated from %s\n"%fname)
! 	if resinfo:
! 		fp.write("Resource %s resid %d %s\n"%(ascii(resinfo[1]), resinfo[0], ascii(resinfo[2])))
  	fp.write('"""\n')
  	fp.write('import aetools\n')
***************
*** 283,294 ****
  	fp.write("\n\n_code_to_module = {\n")
  	for code, modname in suitelist:
! 		fp.write("\t'%s' : %s,\n"%(code, modname))
  	fp.write("}\n\n")
  	fp.write("\n\n_code_to_fullname = {\n")
  	for code, modname in suitelist:
! 		fp.write("\t'%s' : ('%s.%s', '%s'),\n"%(code, packagename, modname, modname))
  	fp.write("}\n\n")
  	for code, modname in suitelist:
  		fp.write("from %s import *\n"%modname)
  	if suitelist:
  		fp.write("\n\nclass %s(%s_Events"%(packagename, suitelist[0][1]))
--- 285,324 ----
  	fp.write("\n\n_code_to_module = {\n")
  	for code, modname in suitelist:
! 		fp.write("\t'%s' : %s,\n"%(ascii(code), modname))
  	fp.write("}\n\n")
  	fp.write("\n\n_code_to_fullname = {\n")
  	for code, modname in suitelist:
! 		fp.write("\t'%s' : ('%s.%s', '%s'),\n"%(ascii(code), packagename, modname, modname))
  	fp.write("}\n\n")
  	for code, modname in suitelist:
  		fp.write("from %s import *\n"%modname)
+ 	
+ 	# Generate property dicts and element dicts for all types declared in this module
+ 	fp.write("def getbaseclasses(v):\n")
+ 	fp.write("\tif hasattr(v, '_superclassnames'):\n")
+ 	fp.write("\t\tv._propdict = {}\n")
+ 	fp.write("\t\tv._elemdict = {}\n")
+ 	fp.write("\t\tfor superclass in v._superclassnames:\n")
+ 	fp.write("\t\t\tgetbaseclasses(superclass)\n")
+ 	fp.write("\t\t\tv._propdict.update(getattr(eval(superclass), '_privpropdict'))\n")
+ 	fp.write("\t\t\tv._elemdict.update(getattr(eval(superclass), '_privelemdict'))\n")
+ 	fp.write("\t\tv._propdict.update(v._privpropdict)\n")
+ 	fp.write("\t\tv._elemdict.update(v._privelemdict)\n")
+ 	fp.write("import StdSuites\n")
+ 	if allprecompinfo:
+ 		fp.write("\n#\n# Set property and element dictionaries now that all classes have been defined\n#\n")
+ 		for codenamemapper in allprecompinfo:
+ 			for k, v in codenamemapper.getall('class'):
+ 				fp.write("getbaseclasses(%s)\n" % v)
+ 
+ 	# Generate a code-to-name mapper for all of the types (classes) declared in this module
+ 	if allprecompinfo:
+ 		fp.write("\n#\n# Indices of types declared in this module\n#\n")
+ 		fp.write("_classdeclarations = {\n")
+ 		for codenamemapper in allprecompinfo:
+ 			for k, v in codenamemapper.getall('class'):
+ 				fp.write("\t%s : %s,\n" % (`ascii(k)`, v))
+ 		fp.write("}\n")
+ 
  	if suitelist:
  		fp.write("\n\nclass %s(%s_Events"%(packagename, suitelist[0][1]))
***************
*** 296,300 ****
  			fp.write(",\n\t\t%s_Events"%modname)
  		fp.write(",\n\t\taetools.TalkTo):\n")
! 		fp.write("\t_signature = %s\n\n"%`creatorsignature`)
  	fp.close()
  	
--- 326,331 ----
  			fp.write(",\n\t\t%s_Events"%modname)
  		fp.write(",\n\t\taetools.TalkTo):\n")
! 		fp.write("\t_signature = %s\n\n"%`ascii(creatorsignature)`)
! 		fp.write("\t_moduleName = '%s'\n\n"%packagename)
  	fp.close()
  	
***************
*** 354,360 ****
  	fss.SetCreatorType('Pyth', 'TEXT')
  	
! 	fp.write('"""Suite %s: %s\n' % (name, desc))
  	fp.write("Level %d, version %d\n\n" % (level, version))
! 	fp.write("Generated from %s\n"%fname)
  	fp.write("AETE/AEUT resource version %d/%d, language %d, script %d\n" % \
  		(major, minor, language, script))
--- 385,391 ----
  	fss.SetCreatorType('Pyth', 'TEXT')
  	
! 	fp.write('"""Suite %s: %s\n' % (ascii(name), ascii(desc)))
  	fp.write("Level %d, version %d\n\n" % (level, version))
! 	fp.write("Generated from %s\n"%ascii(fname))
  	fp.write("AETE/AEUT resource version %d/%d, language %d, script %d\n" % \
  		(major, minor, language, script))
***************
*** 363,367 ****
  	fp.write('import aetools\n')
  	fp.write('import MacOS\n\n')
! 	fp.write("_code = %s\n\n"% `code`)
  	if basepackage and basepackage._code_to_module.has_key(code):
  		# We are an extension of a baseclass (usually an application extending
--- 394,398 ----
  	fp.write('import aetools\n')
  	fp.write('import MacOS\n\n')
! 	fp.write("_code = %s\n\n"% `ascii(code)`)
  	if basepackage and basepackage._code_to_module.has_key(code):
  		# We are an extension of a baseclass (usually an application extending
***************
*** 422,426 ****
  		fp.write("\t_argmap_%s = {\n"%funcname)
  		for a in arguments:
! 			fp.write("\t\t%s : %s,\n"%(`identify(a[0])`, `a[1]`))
  		fp.write("\t}\n\n")
  		
--- 453,457 ----
  		fp.write("\t_argmap_%s = {\n"%funcname)
  		for a in arguments:
! 			fp.write("\t\t%s : %s,\n"%(`identify(a[0])`, `ascii(a[1])`))
  		fp.write("\t}\n\n")
  		
***************
*** 444,448 ****
  	# available documentation, due to our name-remaping)
  	#
! 	fp.write('\t\t"""%s: %s\n'%(name, desc))
  	if has_arg:
  		fp.write("\t\tRequired argument: %s\n"%getdatadoc(accepts))
--- 475,479 ----
  	# available documentation, due to our name-remaping)
  	#
! 	fp.write('\t\t"""%s: %s\n'%(ascii(name), ascii(desc)))
  	if has_arg:
  		fp.write("\t\tRequired argument: %s\n"%getdatadoc(accepts))
***************
*** 459,464 ****
  	# Fiddle the args so everything ends up in 'arguments' dictionary
  	#
! 	fp.write("\t\t_code = %s\n"% `code`)
! 	fp.write("\t\t_subcode = %s\n\n"% `subcode`)
  	#
  	# Do keyword name substitution
--- 490,495 ----
  	# Fiddle the args so everything ends up in 'arguments' dictionary
  	#
! 	fp.write("\t\t_code = %s\n"% `ascii(code)`)
! 	fp.write("\t\t_subcode = %s\n\n"% `ascii(subcode)`)
  	#
  	# Do keyword name substitution
***************
*** 488,492 ****
  			if ename <> '****':
  				fp.write("\t\taetools.enumsubst(_arguments, %s, _Enum_%s)\n" %
! 					(`kname`, identify(ename)))
  				enumsneeded[ename] = 1
  	fp.write("\n")
--- 519,523 ----
  			if ename <> '****':
  				fp.write("\t\taetools.enumsubst(_arguments, %s, _Enum_%s)\n" %
! 					(`ascii(kname)`, identify(ename)))
  				enumsneeded[ename] = 1
  	fp.write("\n")
***************
*** 666,670 ****
  			if self.fp:
  				self.fp.write('\nclass %s(aetools.ComponentItem):\n' % pname)
! 				self.fp.write('\t"""%s - %s """\n' % (name, desc))
  				self.fp.write('\twant = %s\n' % `code`)
  		self.namemappers[0].addnamecode('class', pname, code)
--- 697,701 ----
  			if self.fp:
  				self.fp.write('\nclass %s(aetools.ComponentItem):\n' % pname)
! 				self.fp.write('\t"""%s - %s """\n' % (ascii(name), ascii(desc)))
  				self.fp.write('\twant = %s\n' % `code`)
  		self.namemappers[0].addnamecode('class', pname, code)
***************
*** 690,696 ****
  			if self.fp:
  				self.fp.write("class %s(aetools.NProperty):\n" % pname)
! 				self.fp.write('\t"""%s - %s """\n' % (name, what[1]))
! 				self.fp.write("\twhich = %s\n" % `code`)
! 				self.fp.write("\twant = %s\n" % `what[0]`)
  		self.namemappers[0].addnamecode('property', pname, code)
  	
--- 721,727 ----
  			if self.fp:
  				self.fp.write("class %s(aetools.NProperty):\n" % pname)
! 				self.fp.write('\t"""%s - %s """\n' % (ascii(name), ascii(what[1])))
! 				self.fp.write("\twhich = %s\n" % `ascii(code)`)
! 				self.fp.write("\twant = %s\n" % `ascii(what[0])`)
  		self.namemappers[0].addnamecode('property', pname, code)
  	
***************
*** 698,702 ****
  		[code, keyform] = elem
  		if self.fp:
! 			self.fp.write("#        element %s as %s\n" % (`code`, keyform))
  
  	def fillclasspropsandelems(self, cls):
--- 729,733 ----
  		[code, keyform] = elem
  		if self.fp:
! 			self.fp.write("#        element %s as %s\n" % (`ascii(code)`, ascii(keyform)))
  
  	def fillclasspropsandelems(self, cls):
***************
*** 709,718 ****
--- 740,762 ----
  		plist = []
  		elist = []
+ 		superclasses = []
  		for prop in properties:
  			[pname, pcode, what] = prop
+ 			if pcode == "c@#^":
+ 				superclasses.append(what)
  			if pcode == 'c@#!':
  				continue
  			pname = identify(pname)
  			plist.append(pname)
+ 
+ 		superclassnames = []
+ 		for superclass in superclasses:
+ 			superId, superDesc, dummy = superclass
+ 			superclassname, fullyqualifiedname, module = self.findcodename("class", superId)
+ 			superclassnames.append(superclassname)
+ 
+ 		if self.fp:
+ 			self.fp.write("%s._superclassnames = %s\n"%(cname, `superclassnames`))
+ 
  		for elem in elements:
  			[ecode, keyform] = elem
***************
*** 722,735 ****
  			if not name:
  				if self.fp:
! 					self.fp.write("# XXXX %s element %s not found!!\n"%(cname, `ecode`))
  			else:
  				elist.append((name, ename))
  		
  		if self.fp:
! 			self.fp.write("%s._propdict = {\n"%cname)
  			for n in plist:
  				self.fp.write("\t'%s' : %s,\n"%(n, n))
  			self.fp.write("}\n")
! 			self.fp.write("%s._elemdict = {\n"%cname)
  			for n, fulln in elist:
  				self.fp.write("\t'%s' : %s,\n"%(n, fulln))
--- 766,779 ----
  			if not name:
  				if self.fp:
! 					self.fp.write("# XXXX %s element %s not found!!\n"%(cname, `ascii(ecode)`))
  			else:
  				elist.append((name, ename))
  		
  		if self.fp:
! 			self.fp.write("%s._privpropdict = {\n"%cname)
  			for n in plist:
  				self.fp.write("\t'%s' : %s,\n"%(n, n))
  			self.fp.write("}\n")
! 			self.fp.write("%s._privelemdict = {\n"%cname)
  			for n, fulln in elist:
  				self.fp.write("\t'%s' : %s,\n"%(n, fulln))
***************
*** 742,746 ****
  		if self.fp:
  			self.fp.write("class %s(aetools.NComparison):\n" % iname)
! 			self.fp.write('\t"""%s - %s """\n' % (name, comment))
  		
  	def compileenumeration(self, enum):
--- 786,790 ----
  		if self.fp:
  			self.fp.write("class %s(aetools.NComparison):\n" % iname)
! 			self.fp.write('\t"""%s - %s """\n' % (ascii(name), ascii(comment)))
  		
  	def compileenumeration(self, enum):
***************
*** 757,761 ****
  	def compileenumerator(self, item):
  		[name, code, desc] = item
! 		self.fp.write("\t%s : %s,\t# %s\n" % (`identify(name)`, `code`, desc))
  		
  	def checkforenum(self, enum):
--- 801,805 ----
  	def compileenumerator(self, item):
  		[name, code, desc] = item
! 		self.fp.write("\t%s : %s,\t# %s\n" % (`identify(name)`, `ascii(code)`, desc))
  		
  	def checkforenum(self, enum):
***************
*** 764,768 ****
  		if not name:
  			if self.fp:
! 				self.fp.write("_Enum_%s = None # XXXX enum %s not found!!\n"%(identify(enum), enum))
  			return
  		if module:
--- 808,812 ----
  		if not name:
  			if self.fp:
! 				self.fp.write("_Enum_%s = None # XXXX enum %s not found!!\n"%(identify(enum), ascii(enum)))
  			return
  		if module:
***************
*** 776,792 ****
  		self.fp.write("_classdeclarations = {\n")
  		for k, v in self.namemappers[0].getall('class'):
! 			self.fp.write("\t%s : %s,\n" % (`k`, v))
  		self.fp.write("}\n")
  		self.fp.write("\n_propdeclarations = {\n")
  		for k, v in self.namemappers[0].getall('property'):
! 			self.fp.write("\t%s : %s,\n" % (`k`, v))
  		self.fp.write("}\n")
  		self.fp.write("\n_compdeclarations = {\n")
  		for k, v in self.namemappers[0].getall('comparison'):
! 			self.fp.write("\t%s : %s,\n" % (`k`, v))
  		self.fp.write("}\n")
  		self.fp.write("\n_enumdeclarations = {\n")
  		for k, v in self.namemappers[0].getall('enum'):
! 			self.fp.write("\t%s : %s,\n" % (`k`, v))
  		self.fp.write("}\n")
  
--- 820,836 ----
  		self.fp.write("_classdeclarations = {\n")
  		for k, v in self.namemappers[0].getall('class'):
! 			self.fp.write("\t%s : %s,\n" % (`ascii(k)`, v))
  		self.fp.write("}\n")
  		self.fp.write("\n_propdeclarations = {\n")
  		for k, v in self.namemappers[0].getall('property'):
! 			self.fp.write("\t%s : %s,\n" % (`ascii(k)`, v))
  		self.fp.write("}\n")
  		self.fp.write("\n_compdeclarations = {\n")
  		for k, v in self.namemappers[0].getall('comparison'):
! 			self.fp.write("\t%s : %s,\n" % (`ascii(k)`, v))
  		self.fp.write("}\n")
  		self.fp.write("\n_enumdeclarations = {\n")
  		for k, v in self.namemappers[0].getall('enum'):
! 			self.fp.write("\t%s : %s,\n" % (`ascii(k)`, v))
  		self.fp.write("}\n")
  
***************
*** 807,816 ****
  	[type, descr, flags] = data
  	if descr:
! 		return descr
  	if type == '****':
  		return 'anything'
  	if type == 'obj ':
  		return 'an AE object reference'
! 	return "undocumented, typecode %s"%`type`
  
  dataflagdict = {15: "optional", 14: "list", 13: "enum", 12: "mutable"}
--- 851,860 ----
  	[type, descr, flags] = data
  	if descr:
! 		return ascii(descr)
  	if type == '****':
  		return 'anything'
  	if type == 'obj ':
  		return 'an AE object reference'
! 	return "undocumented, typecode %s"%`ascii(type)`
  
  dataflagdict = {15: "optional", 14: "list", 13: "enum", 12: "mutable"}
***************
*** 825,828 ****
--- 869,884 ----
  	return '[%s]' % string.join(bits)
  	
+ def ascii(str):
+ 	"""Return a string with all non-ascii characters hex-encoded"""
+ 	if type(str) != type(''):
+ 		return map(ascii, str)
+ 	rv = ''
+ 	for c in str:
+ 		if c in ('\t', '\n', '\r') or ' ' <= c < chr(0x7f):
+ 			rv = rv + c
+ 		else:
+ 			rv = rv + '\\x%02.2x' % ord(c)
+ 	return rv
+ 	
  def identify(str):
  	"""Turn any string into an identifier:
***************
*** 853,855 ****
  	main()
  	sys.exit(1)
! print identify('for')
\ No newline at end of file
--- 909,911 ----
  	main()
  	sys.exit(1)
! print identify('for')