| # Copyright (C) 2016 the V8 project authors. All rights reserved. |
| # This code is governed by the BSD license found in the LICENSE file. |
| |
| import glob, os, re |
| |
| from .case import Case |
| from .template import Template |
| |
| caseFilenamePattern = re.compile(r'^[^\.].*\.case$') |
| templateFilenamePattern = re.compile(r'^[^\.].*\.template$') |
| |
| class Expander: |
| def __init__(self, case_dir): |
| self.templates = dict() |
| self.case_dir = case_dir |
| |
| def _load_templates(self, template_group, encoding): |
| directory = os.path.join(self.case_dir, template_group) |
| file_names = [] |
| |
| for expanded_directory in glob.glob(directory): |
| try: |
| file_names.extend( |
| map( |
| lambda x: os.path.join(expanded_directory, x), |
| filter(self.is_template_file, os.listdir(expanded_directory)) |
| ) |
| ) |
| except: |
| file_names.append(expanded_directory) |
| |
| self.templates[template_group] = [ |
| Template(x, encoding) for x in file_names |
| ] |
| |
| def _get_templates(self, template_group, encoding): |
| if not template_group in self.templates: |
| self._load_templates(template_group, encoding) |
| |
| return self.templates[template_group] |
| |
| def is_template_file(self, filename): |
| return re.match(templateFilenamePattern, filename) |
| |
| def list_cases(self): |
| for name in os.listdir(self.case_dir): |
| full = os.path.join(self.case_dir, name) |
| if os.path.isfile(full) and caseFilenamePattern.match(name): |
| yield full |
| |
| def expand(self, encoding, case_file = None): |
| if case_file: |
| case_files = [case_file] |
| else: |
| case_files = self.list_cases() |
| |
| for case_file in case_files: |
| for test in self.expand_case(case_file, encoding): |
| yield test |
| |
| def expand_case(self, file_name, encoding): |
| case = Case(file_name, encoding) |
| localtemplates = []; |
| |
| if 'template' in case.attribs['meta']: |
| localtemplates.append(case.attribs['meta']['template']) |
| |
| if 'templates' in case.attribs['meta']: |
| localtemplates.extend(case.attribs['meta']['templates']) |
| |
| for t in localtemplates: |
| template_group = t |
| templates = self.templates.get(template_group) |
| |
| for template in self._get_templates(template_group, encoding): |
| yield template.expand(file_name, os.path.basename(file_name[:-5]), case.attribs, encoding) |