def test_is_package(self): file_name = "../ast_tool_box" assert_true(Util.is_package(file_name)) file_name = "../images" assert_false(Util.is_package(file_name))
def update(self): self.load_error_info = None self.load_error_line_number = None if self.package_name in sys.modules: Util.clear_classes_in_package(self.package_name) self.source_text = '' with open(self.file_name, "r") as f: self.source_text = f.read() self.class_def_nodes = {} self.node_transforms = [] self.code_generators = [] self.ast_tree = ast.parse(self.source_text) for node in ast.walk(self.ast_tree): if isinstance(node, ast.ClassDef): self.class_def_nodes[node.name] = node print("transform file %s %s" % (self.path, self.package_name)) if not self.path in sys.path: sys.path.append(self.path) try: __import__(self.package_name) except Exception as exception: exc_type, exc_obj, exc_tb = sys.exc_info() message = "Exception: %s" % exception.message message += "\nWhile loading file %s" % self.file_name if hasattr(exc_tb, 'tb_lineno'): message += "\nAt line number %s" % exc_tb.tb_lineno print("cannot load %s message %s" % (self.package_name, exception.message)) self.load_error_info = message self.load_error_line_number = exc_tb.tb_lineno return module = sys.modules[self.package_name] for key in module.__dict__: thing = module.__dict__[key] new_transform = TransformFactory.get(thing, file_name=self.file_name, transform_collection=self) if isinstance(new_transform, AstTransformItem): self.node_transforms.append(new_transform) elif isinstance(new_transform, CodeGeneratorItem): self.code_generators.append(new_transform) self.node_transforms.sort(key=methodcaller('name')) self.code_generators.sort(key=methodcaller('name'))
def test_path_to_path_and_package(self): file = "ast_tool_box/test/sample.py" path, package = Util.path_to_path_and_package(file) assert_equal("ast_tool_box/test", path) assert_equal(package, "sample") file = "../ast_tool_box/transformers/identity_transform.py" # file = "../ast_tool_box/models/ast_transformer.py" print "file %s" % __file__ path, package = Util.path_to_path_and_package(file) assert_equal("..", path) assert_equal("ast_tool_box.transformers.identity_transform", package)
def test_basic_load(self): with open('transform.py', "w+") as f: f.write(file2) name = 'test.transform' __import__(name) assert name in modules loaded_module = modules[name] transformer1 = loaded_module.__dict__['Transformer1'] assert issubclass(transformer1, ast.NodeTransformer) transformer2 = loaded_module.__dict__['Transformer2'] assert issubclass(transformer2, ast.NodeTransformer) transformer3 = loaded_module.__dict__['Transformer3'] assert issubclass(transformer3, ast.NodeTransformer) subprocess.call("rm -f transform.pyc", shell=True) with open('transform.py', "w+") as f: f.write(file1) imp.reload(loaded_module) #loaded_module = modules[name] print(loaded_module) Util.clear_classes_and_reload_package(name) assert not 'Transformer2' in loaded_module.__dict__ loaded_module = modules[name] transformer1 = loaded_module.__dict__['Transformer1'] assert issubclass(transformer1, ast.NodeTransformer) pprint(loaded_module.__dict__) assert not 'Transformer2' in loaded_module.__dict__ assert not 'Transformer3' in loaded_module.__dict__ subprocess.call("rm -f transform.py", shell=True)
def load_transformers(self, key): path, package_name = Util.path_to_path_and_package(key) print("path %s package %s" % (path, package_name)) if not path in sys.path: sys.path.append(path) self.get_ast_transformers(package_name) self.reload() print("AstTransformerManager %s" % self)
def __init__(self, raw_package_name): super(TransformPackage, self).__init__(raw_package_name) self.file_name = raw_package_name self.base_name = raw_package_name.split(".")[0] self.source_text = '' self.load_error_info = None self.load_error_line_number = None self.path, self.package_name = Util.path_to_path_and_package(self.file_name) self.path = os.path.abspath(self.path) self.update()
def __init__(self, raw_package_name): super(TransformPackage, self).__init__(raw_package_name) print(raw_package_name) self.file_name = raw_package_name self.base_name = raw_package_name.split(".")[0] self.source_text = '' self.load_error_info = None self.load_error_line_number = None self.path, self.package_name = Util.path_to_path_and_package( self.file_name) self.path = os.path.abspath(self.path) self.update()
def __init__(self, file_name): super(TransformFile, self).__init__(file_name) self.file_name = file_name self.base_name = os.path.basename(file_name) self.load_error_info = None self.load_error_line_number = None self.class_def_nodes = {} self.ast_tree = None self.source_text = '' self.path, self.package_name = Util.path_to_path_and_package(self.file_name) self.path = os.path.abspath(self.path) self.update()
def __init__(self, file_name): super(TransformFile, self).__init__(file_name) self.file_name = file_name self.base_name = os.path.basename(file_name) self.load_error_info = None self.load_error_line_number = None self.class_def_nodes = {} self.ast_tree = None self.source_text = '' self.path, self.package_name = Util.path_to_path_and_package( self.file_name) self.path = os.path.abspath(self.path) self.update()
def delete_module(module_name): Util.clear_classes_in_package(module_name)