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) |