def handle_templates()

in automation/tincrepo/main/mpp/models/sql_tc.py [0:0]


    def handle_templates(cls):
        """
        This class method checks if any template directory exists. 
        If they do, copy/parse all the sql and ans directories to out_dir.

        @rtype: boolean
        @return: Return True, if templates are found. False, otherwise
        """
        # Variables to store non-template directories
        sql_dir = cls.get_sql_dir()
        sql_setup_dir = os.path.join(sql_dir, "setup")
        sql_teardown_dir = os.path.join(sql_dir, "teardown")
        ans_dir = cls.get_ans_dir()
        ans_setup_dir = os.path.join(ans_dir, "setup")
        ans_teardown_dir = os.path.join(ans_dir, "teardown")
        
        # Variables to store template directories
        sql_template_dir = os.path.join(sql_dir, cls.template_dir)
        sql_setup_template_dir = os.path.join(sql_setup_dir, cls.template_dir)
        sql_teardown_template_dir = os.path.join(sql_teardown_dir, cls.template_dir)
        ans_template_dir = os.path.join(ans_dir, cls.template_dir)
        ans_setup_template_dir = os.path.join(ans_setup_dir, cls.template_dir)
        ans_teardown_template_dir = os.path.join(ans_teardown_dir, cls.template_dir)
        
        # Define a set for all template dir
        # Check if any exists, while creating a set.
        template_dir_set = set([sql_template_dir, sql_setup_template_dir, sql_teardown_template_dir, ans_template_dir, ans_setup_template_dir, ans_teardown_template_dir])
        for each_dir in template_dir_set:
            # Check if any of the template directory exists.
            tinctest.logger.debug("Checking if directory %s exists..." % each_dir)
            if os.path.exists(each_dir):
                cls._template_exist = True
                break
        
        if not cls._template_exist:
            # Nothing to do
            tinctest.logger.debug("No template directories found.")
            return False
        
        ####################################################
        # If here, we have at least one template directory #
        ####################################################
        
        # Define local variables to store all the out directories
        # SQL files go in out/sql directory, and ans file go in out/ans directory
        out_dir = cls.get_out_dir()
        out_sql_dir = os.path.join(out_dir, cls.__name__, cls.sql_dir)
        out_sql_setup_dir = os.path.join(out_dir, cls.__name__, cls.sql_dir, "setup")
        out_sql_teardown_dir = os.path.join(out_dir, cls.__name__, cls.sql_dir, "teardown")
        out_ans_dir = os.path.join(out_dir, cls.__name__, cls.ans_dir)
        out_ans_setup_dir = os.path.join(out_dir, cls.__name__, cls.ans_dir, "setup")
        out_ans_teardown_dir = os.path.join(out_dir, cls.__name__, cls.ans_dir, "teardown")
        out_dir_set = sorted(set([out_sql_dir, out_sql_setup_dir, out_sql_teardown_dir, out_ans_dir, out_ans_setup_dir, out_ans_teardown_dir]))
        
        tinctest.logger.debug("Templates are found. Copy or parse sql files/dirs to directory %s. Copy or parse ans files/dirs to directory %s" % (out_sql_dir, out_ans_dir))
        
        for each_dir in out_dir_set:
            if os.path.exists(each_dir):
                tinctest.logger.warning("Directory %s already exists. Deleting it to start from scratch. Use different output directory to avoid this behavior!" % each_dir)
                shutil.rmtree(each_dir, ignore_errors = True)
            TINCSystem.make_dirs(each_dir, ignore_exists_error = True)
            
        # Define several sets to store all the sql dirs, ans dirs, setup dirs, etc.
        
        # Define sets for all sql and ans dirs
        sql_dir_set = set([sql_dir, sql_setup_dir, sql_teardown_dir, sql_template_dir, sql_setup_template_dir, sql_teardown_template_dir])
        ans_dir_set = set([ans_dir, ans_setup_dir, ans_teardown_dir, ans_template_dir, ans_setup_template_dir, ans_teardown_template_dir])
        
        # Define sets for all setup and teardown dirs
        setup_dir_set = set([sql_setup_dir, ans_setup_dir, sql_setup_template_dir, ans_setup_template_dir])
        teardown_dir_set = set([sql_teardown_dir, ans_teardown_dir, sql_teardown_template_dir, ans_teardown_template_dir])
        
        # Define a set for all dirs as union of sql and ans dir
        dir_set = sql_dir_set.union(ans_dir_set)
        
        # Type of files that will be copied or parsed
        file_types = ["*.sql", "*.ans", "*.ans.orca", "*.ans.planner"]
        
        # Go through each directory to either copy it or parse it
        for each_dir in dir_set:
            if not os.path.exists(each_dir):
                continue
            
            # SQL dir goes to out_dir/sql; ANS dir goes to out_dir/ans
            destination_dir = out_sql_dir
            if each_dir in ans_dir_set:
                destination_dir = out_ans_dir

            # Setup and Teardown files go in out/sql/setup, out/ans/teardown, etc.
            if each_dir in setup_dir_set:
                destination_dir = os.path.join(destination_dir, 'setup')
            elif each_dir in teardown_dir_set:
                destination_dir = os.path.join(destination_dir, 'teardown')

            # If template directory, parse it. Else, copy it.
            if each_dir in template_dir_set:
                tinctest.logger.debug("Directory %s is a template directory. Parse it and save the results in %s." % (each_dir, destination_dir))
                TINCSystem.substitute_strings_in_directory(each_dir, destination_dir, cls.template_subs, file_types, destination_file_prefix = "template_")
            else:
                tinctest.logger.debug("Directory %s is not a template directory. Copy its sql and ans files as is in %s." % (each_dir, destination_dir))
                TINCSystem.copy_directory(each_dir, destination_dir, file_types)
        
        return True