def find_classes_ast(package): """ Find classes by traversing an abstract syntax tree generated by the compiler module. fixme: expand docstring, possibly provide response about non-existant modules/packages """ classes = [] # It is a package (ie a directory) if is_package(package): package_path = get_module_path(package) file_paths = find_package_sub_modules(package) for file_path in file_paths: try: file = open(file_path) # Adding a new line to the source, so that compile wouldn't # throw a SyntaxError on EOF comment source = file.read().replace('\r\n', '\n') + '\n' ast = compile(source, file_path, 'exec', _ast.PyCF_ONLY_AST) file.close() python_path = python_path_from_file_path( package, file_path, package_path=package_path) classes.extend(visit_ast_node(ast, file_path, python_path)) except SyntaxError: msg = 'SyntaxError in parsing file %s' % file_path logger.error(msg) # It is a module (ie a .py file) elif is_module(package): file_path = get_module_path(package) file = open(file_path) # Adding a new line to the source, so that compile wouldn't # throw a SyntaxError on EOF comment source = file.read().replace('\r\n', '\n') + '\n' ast = compile(source, file_path, 'exec', _ast.PyCF_ONLY_AST) file.close() classes.extend(visit_ast_node(ast, file_path, package)) return classes
def find_classes_ast(package): """ Find classes by traversing an abstract syntax tree generated by the compiler module. fixme: expand docstring, possibly provide response about non-existant modules/packages """ classes = [] # It is a package (ie a directory) if is_package(package): package_path = get_module_path(package) file_paths = find_package_sub_modules(package) for file_path in file_paths: try: file = open(file_path) # Adding a new line to the source, so that compile wouldn't # throw a SyntaxError on EOF comment source = file.read().replace('\r\n','\n')+'\n' ast = compile(source, file_path,'exec', _ast.PyCF_ONLY_AST) file.close() python_path = python_path_from_file_path(package, file_path, package_path=package_path) classes.extend(visit_ast_node(ast, file_path, python_path)) except SyntaxError: msg = 'SyntaxError in parsing file %s'% file_path logger.error(msg) # It is a module (ie a .py file) elif is_module(package): file_path = get_module_path(package) file = open(file_path) # Adding a new line to the source, so that compile wouldn't # throw a SyntaxError on EOF comment source = file.read().replace('\r\n','\n')+'\n' ast = compile(source, file_path, 'exec', _ast.PyCF_ONLY_AST) file.close() classes.extend(visit_ast_node(ast, file_path, package)) return classes
def test_is_module_for_package(self): sys.path.append(os.path.dirname(__file__)) self.assertFalse(is_module('sample_package')) del sys.path[-1]
def test_is_module_for_module(self): self.assertTrue(is_module('os'))