mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	Got rid of the "enum not found" interaction, and added code to allow
overriding the creator signature.
This commit is contained in:
		
							parent
							
								
									714caa0c35
								
							
						
					
					
						commit
						59cdbce9b1
					
				
					 1 changed files with 43 additions and 20 deletions
				
			
		| 
						 | 
					@ -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():
 | 
				
			||||||
		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():
 | 
				
			||||||
				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():
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
		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():
 | 
				
			||||||
			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
 | 
				
			||||||
	# 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):
 | 
				
			||||||
		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,10 +312,12 @@ 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)
 | 
				
			||||||
 | 
						if not creatorsignature:
 | 
				
			||||||
		creatorsignature, dummy = MacOS.GetCreatorAndType(fname)
 | 
							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:
 | 
				
			||||||
| 
						 | 
					@ -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):
 | 
				
			||||||
	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):
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	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
 | 
				
			||||||
	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):
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
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:
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		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:
 | 
				
			||||||
		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:
 | 
				
			||||||
				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)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue