def generate(self, out_path, lang, srm, solution_file=None): template_to_use = None template_file = None try: type_converter = HarnessGenerator.sig_type_converters[lang] template_file_name = HarnessGenerator.templates[lang] template_path = self._conf.app_data_join(template_file_name) if not os.path.isfile(template_path): self._conf.init_data_file(template_file_name) template_file = open(template_path, 'r') template_to_use = stringtemplate3.StringTemplate(template_file.read()) probs = [] for p in srm.problems: (result_type, param_types) = parse_method_sig(p.method_sig) result_type = type_converter(result_type) param_types = [type_converter(param) for param in param_types] probs[len(probs):] = [{ 'type_name': p.type_name, 'method_name': p.method_name, 'method_arity': p.method_arity, 'result_type': result_type, 'param_types': param_types, 'arg_impl': self.__make_arg_impl(p.method_arity) }] template_to_use['problems'] = probs if solution_file: print 'setting' templates_to_use['solution_file'] = solution_file finally: if template_file: template_file.close() out = None try: out = open(out_path, 'w') out.write(str(template_to_use)) finally: if out: out.close()
def generate(self, out_path, lang, srm, problem=None): template_to_use = None type_converter = None problems = None if problem: problems = [problem] else: srm.order_problems() problems = srm.problems template_file = None try: type_converter = SolutionGenerator.sig_type_converters[lang] template_file_name = SolutionGenerator.templates[lang] template_path = self._conf.app_data_join(template_file_name) if not os.path.isfile(template_path): self._conf.init_data_file(template_file_name) template_file = open(template_path, 'r') template_to_use = stringtemplate3.StringTemplate(template_file.read()) finally: if template_file: template_file.close() problem_array = [] for p in problems: (result_type, param_types) = parse_method_sig(p.method_sig, keep_param_names=True) param_types = [(type_converter(param[0]), param[1]) for param in param_types] # create method sig method_sig = type_converter(result_type) + ' ' + p.method_name + '(' method_sig += ', '.join(['%s %s' % param for param in param_types]) method_sig += ')' # create statement brs_removed = re.sub(r'\s*<[Bb][Rr]\s*/>\s*', '\n\n', p.statement) brs_removed = re.sub(r'\s*<[Bb][Rr]\s*>\s*</[Bb][Rr]\s*>', '\n\n', brs_removed) paragraphed = [] for sect in re.split(r'[\r\n]+', brs_removed): paragraphed[len(paragraphed):] = ['<p>', sect, '</p>'] paragraphed = ''.join(paragraphed) document, errors = tidy_document( paragraphed, options={'show-body-only': True, 'wrap': 76, 'indent': True, 'vertical-space': True}) document = re.sub(r'</?p/?>\n', '', str(document)) statement = unescape_html(document.replace('\n', '\n//! ')) # assign properties for problem problem_array[len(problem_array):] = [{ 'level': p.level, 'statement': statement, 'type_name': p.type_name, 'method_sig': method_sig }] template_to_use['srm'] = {'problems': problem_array, 'title': srm.title} out = None try: out = open(out_path, 'w') out.write(str(template_to_use)) finally: if out: out.close()
def validate_arg_input(self, txt): # TODO: caching this data may make things faster. would definitely be cleaner... result, params = parse_method_sig(self.method_sig) return validate_arg_data(params, txt)