Пример #1
0
    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))
Пример #2
0
    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'))
Пример #3
0
    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'))
Пример #4
0
    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)
Пример #7
0
    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)
Пример #8
0
    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()
Пример #9
0
    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()
Пример #10
0
    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()
Пример #11
0
    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()
Пример #12
0
 def delete_module(module_name):
     Util.clear_classes_in_package(module_name)