Utilities/ModuleParser.py

changeset 12
1d8dd9706f46
parent 0
de9c2efb9d02
child 13
1af94a91f439
equal deleted inserted replaced
11:b0996e4a289e 12:1d8dd9706f46
20 import os 20 import os
21 import imp 21 import imp
22 import re 22 import re
23 23
24 import Utilities 24 import Utilities
25 from functools import reduce
25 26
26 __all__ = ["Module", "Class", "Function", "RbModule", "readModule"] 27 __all__ = ["Module", "Class", "Function", "RbModule", "readModule"]
27 28
28 TABWIDTH = 4 29 TABWIDTH = 4
29 30
380 Public method to add information about a class. 381 Public method to add information about a class.
381 382
382 @param name name of class to be added (string) 383 @param name name of class to be added (string)
383 @param _class Class object to be added 384 @param _class Class object to be added
384 """ 385 """
385 if self.classes.has_key(name): 386 if name in self.classes:
386 self.classes_counts[name] += 1 387 self.classes_counts[name] += 1
387 name = "%s_%d" % (name, self.classes_counts[name]) 388 name = "%s_%d" % (name, self.classes_counts[name])
388 else: 389 else:
389 self.classes_counts[name] = 0 390 self.classes_counts[name] = 0
390 self.classes[name] = _class 391 self.classes[name] = _class
394 Public method to add information about a Ruby module. 395 Public method to add information about a Ruby module.
395 396
396 @param name name of module to be added (string) 397 @param name name of module to be added (string)
397 @param module Module object to be added 398 @param module Module object to be added
398 """ 399 """
399 if self.modules.has_key(name): 400 if name in self.modules:
400 self.modules_counts[name] += 1 401 self.modules_counts[name] += 1
401 name = "%s_%d" % (name, self.modules_counts[name]) 402 name = "%s_%d" % (name, self.modules_counts[name])
402 else: 403 else:
403 self.modules_counts[name] = 0 404 self.modules_counts[name] = 0
404 self.modules[name] = module 405 self.modules[name] = module
408 Public method to add information about a function. 409 Public method to add information about a function.
409 410
410 @param name name of function to be added (string) 411 @param name name of function to be added (string)
411 @param function Function object to be added 412 @param function Function object to be added
412 """ 413 """
413 if self.functions.has_key(name): 414 if name in self.functions:
414 self.functions_counts[name] += 1 415 self.functions_counts[name] += 1
415 name = "%s_%d" % (name, self.functions_counts[name]) 416 name = "%s_%d" % (name, self.functions_counts[name])
416 else: 417 else:
417 self.functions_counts[name] = 0 418 self.functions_counts[name] = 0
418 self.functions[name] = function 419 self.functions[name] = function
606 inherit = _commentsub('', inherit) 607 inherit = _commentsub('', inherit)
607 names = [] 608 names = []
608 for n in inherit.split(','): 609 for n in inherit.split(','):
609 n = n.strip() 610 n = n.strip()
610 if n: 611 if n:
611 if self.classes.has_key(n): 612 if n in self.classes:
612 # we know this super class 613 # we know this super class
613 n = self.classes[n].name 614 n = self.classes[n].name
614 else: 615 else:
615 c = n.split('.') 616 c = n.split('.')
616 if len(c) > 1: 617 if len(c) > 1:
617 # super class is of the 618 # super class is of the
618 # form module.class: 619 # form module.class:
619 # look in module for class 620 # look in module for class
620 m = c[-2] 621 m = c[-2]
621 c = c[-1] 622 c = c[-1]
622 if _modules.has_key(m): 623 if m in _modules:
623 m = _modules[m] 624 m = _modules[m]
624 n = m.name 625 n = m.name
625 names.append(n) 626 names.append(n)
626 inherit = names 627 inherit = names
627 # remember this class 628 # remember this class
679 680
680 elif m.start("ImportFrom") >= 0: 681 elif m.start("ImportFrom") >= 0:
681 # from module import stuff 682 # from module import stuff
682 mod = m.group("ImportFromPath") 683 mod = m.group("ImportFromPath")
683 names = m.group("ImportFromList").split(',') 684 names = m.group("ImportFromList").split(',')
684 if not self.from_imports.has_key(mod): 685 if mod not in self.from_imports:
685 self.from_imports[mod] = [] 686 self.from_imports[mod] = []
686 for n in names: 687 for n in names:
687 n = n.strip() 688 n = n.strip()
688 self.from_imports[mod].append(n) 689 self.from_imports[mod].append(n)
689 690
818 # add nested classes to the file 819 # add nested classes to the file
819 if classstack and isinstance(classstack[-1][0], RbModule): 820 if classstack and isinstance(classstack[-1][0], RbModule):
820 parent_obj = classstack[-1][0] 821 parent_obj = classstack[-1][0]
821 else: 822 else:
822 parent_obj = self 823 parent_obj = self
823 if parent_obj.classes.has_key(class_name): 824 if class_name in parent_obj.classes:
824 cur_class = parent_obj.classes[class_name] 825 cur_class = parent_obj.classes[class_name]
825 elif classstack and \ 826 elif classstack and \
826 isinstance(classstack[-1][0], Class) and \ 827 isinstance(classstack[-1][0], Class) and \
827 class_name == "self": 828 class_name == "self":
828 cur_class = classstack[-1][0] 829 cur_class = classstack[-1][0]
848 module_name = m.group("ModuleName") 849 module_name = m.group("ModuleName")
849 # remember this class 850 # remember this class
850 cur_class = RbModule(self.name, module_name, 851 cur_class = RbModule(self.name, module_name,
851 self.file, lineno) 852 self.file, lineno)
852 # add nested Ruby modules to the file 853 # add nested Ruby modules to the file
853 if self.modules.has_key(module_name): 854 if module_name in self.modules:
854 cur_class = self.modules[module_name] 855 cur_class = self.modules[module_name]
855 else: 856 else:
856 self.addModule(module_name, cur_class) 857 self.addModule(module_name, cur_class)
857 cur_obj = cur_class 858 cur_obj = cur_class
858 classstack.append((cur_class, thisindent)) 859 classstack.append((cur_class, thisindent))
988 Public method to build the inheritance hierarchy for all classes of this module. 989 Public method to build the inheritance hierarchy for all classes of this module.
989 990
990 @return A dictionary with inheritance hierarchies. 991 @return A dictionary with inheritance hierarchies.
991 """ 992 """
992 hierarchy = {} 993 hierarchy = {}
993 for cls in self.classes.keys(): 994 for cls in list(list(self.classes.keys())):
994 self.assembleHierarchy(cls, self.classes, [cls], hierarchy) 995 self.assembleHierarchy(cls, self.classes, [cls], hierarchy)
995 for mod in self.modules.keys(): 996 for mod in list(list(self.modules.keys())):
996 self.assembleHierarchy(mod, self.modules, [mod], hierarchy) 997 self.assembleHierarchy(mod, self.modules, [mod], hierarchy)
997 return hierarchy 998 return hierarchy
998 999
999 def assembleHierarchy(self, name, classes, path, result): 1000 def assembleHierarchy(self, name, classes, path, result):
1000 """ 1001 """
1010 @param classes A dictionary of classes to look in. 1011 @param classes A dictionary of classes to look in.
1011 @param path 1012 @param path
1012 @param result The resultant hierarchy 1013 @param result The resultant hierarchy
1013 """ 1014 """
1014 rv = {} 1015 rv = {}
1015 if classes.has_key(name): 1016 if name in classes:
1016 for cls in classes[name].super: 1017 for cls in classes[name].super:
1017 if not classes.has_key(cls): 1018 if cls not in classes:
1018 rv[cls] = {} 1019 rv[cls] = {}
1019 exhausted = path + [cls] 1020 exhausted = path + [cls]
1020 exhausted.reverse() 1021 exhausted.reverse()
1021 self.addPathToHierarchy(exhausted, result, self.addPathToHierarchy) 1022 self.addPathToHierarchy(exhausted, result, self.addPathToHierarchy)
1022 else: 1023 else:
1035 @param path the exhausted path of classes 1036 @param path the exhausted path of classes
1036 @param result the result dictionary 1037 @param result the result dictionary
1037 @param fn function to call for classe that are already part of the 1038 @param fn function to call for classe that are already part of the
1038 result dictionary 1039 result dictionary
1039 """ 1040 """
1040 if path[0] in result.keys(): 1041 if path[0] in list(list(result.keys())):
1041 if len(path) > 1: 1042 if len(path) > 1:
1042 fn(path[1:], result[path[0]], fn) 1043 fn(path[1:], result[path[0]], fn)
1043 else: 1044 else:
1044 for part in path: 1045 for part in path:
1045 result[part] = {} 1046 result[part] = {}
1304 if modname.lower().endswith(ext): 1305 if modname.lower().endswith(ext):
1305 modname = modname[:-len(ext)] 1306 modname = modname[:-len(ext)]
1306 break 1307 break
1307 module = os.path.basename(module) 1308 module = os.path.basename(module)
1308 1309
1309 if caching and _modules.has_key(modname): 1310 if caching and modname in _modules:
1310 # we've seen this module before... 1311 # we've seen this module before...
1311 return _modules[modname] 1312 return _modules[modname]
1312 1313
1313 if module in sys.builtin_module_names: 1314 if module in sys.builtin_module_names:
1314 # this is a built-in module 1315 # this is a built-in module
1334 _modules[modname] = Module(modname, None, None) 1335 _modules[modname] = Module(modname, None, None)
1335 return _modules[modname] 1336 return _modules[modname]
1336 1337
1337 mod = Module(modname, file, type) 1338 mod = Module(modname, file, type)
1338 try: 1339 try:
1339 src = Utilities.decode(f.read())[0] 1340 src = f.read()
1340 mod.scan(src) 1341 mod.scan(src)
1341 finally: 1342 finally:
1342 f.close() 1343 f.close()
1343 if caching: 1344 if caching:
1344 _modules[modname] = mod 1345 _modules[modname] = mod
1386 raise ImportError 1387 raise ImportError
1387 1388
1388 # standard Python module file 1389 # standard Python module file
1389 if name.lower().endswith('.py'): 1390 if name.lower().endswith('.py'):
1390 name = name[:-3] 1391 name = name[:-3]
1391 if type(name) == type(u""): 1392 ## if isinstance(name, type("")):
1392 name = name.encode('utf-8') 1393 ## name = name.encode('utf-8')
1393 1394
1394 return imp.find_module(name, path) 1395 return imp.find_module(name, path)
1395 1396
1396 def resetParsedModules(): 1397 def resetParsedModules():
1397 """ 1398 """
1423 modname = modname[:-4] 1424 modname = modname[:-4]
1424 elif modname.lower().endswith(".rb"): 1425 elif modname.lower().endswith(".rb"):
1425 modname = modname[:-3] 1426 modname = modname[:-3]
1426 module = os.path.basename(module) 1427 module = os.path.basename(module)
1427 1428
1428 if _modules.has_key(modname): 1429 if modname in _modules:
1429 del _modules[modname] 1430 del _modules[modname]
1430 1431
1431 if __name__ == "__main__": 1432 if __name__ == "__main__":
1432 # Main program for testing. 1433 # Main program for testing.
1433 mod = sys.argv[1] 1434 mod = sys.argv[1]
1434 module = readModule(mod) 1435 module = readModule(mod)
1435 for cls in module.classes.values(): 1436 for cls in list(module.classes.values()):
1436 print "--------------" 1437 print("--------------")
1437 print cls.name 1438 print(cls.name)
1438 for meth in cls.methods.values(): 1439 for meth in list(cls.methods.values()):
1439 print meth.name, meth.pyqtSignature 1440 print(meth.name, meth.pyqtSignature)

eric ide

mercurial