def invoke_macro(self, macro, args, original_parser): parsed_args = [] for arg in args: p = Parser(arg) p.changequote('[',']') macro_handler.add_macros(MACROS, p) stream = StringIO() p.parse(stream=stream) parsed_args.append(stream.getvalue()) return getattr(self, macro)(parsed_args)
def check_file(self, input_file, expected_file, thing): expected = open(expected_file, 'r').read() if thing == 'm4': # check m4 output m4_output = subprocess.check_output(['m4', input_file]) self.assertEqual(m4_output, expected) elif thing == 'parser': stream = StringIO() Parser(open(input_file, 'r').read()).parse(stream=stream) self.assertEqual(stream.getvalue(), expected)
def translate(self, shell, toplevel=False): commands, leftover = pyshyacc.parse(shell, True) if toplevel: return self.translate_toplevel(commands) return flatten(self.translate_commands(commands)) def translate_toplevel(self, commands): main = filter(lambda x: isinstance(x, ast.FunctionDef) and x.name == 'main', self.template.body)[0] main.body.extend(flatten(self.translate_commands(commands))) substassign = filter(lambda x: isinstance(x, ast.Assign) and x.targets[0].id == 'SUBSTS', self.template.body)[0] substassign.value.args = [ast.List([ast.Str(s) for s in self.macro_handler.substs], ast.Load())] make_arg_parser = filter(lambda x: isinstance(x, ast.FunctionDef) and x.name == 'make_arg_parser', self.template.body)[0] make_arg_parser.body[-1:-1] = self.make_argparse_arguments() p = Parser(sys.stdin.read()) p.changequote('[',']') macro_handler = MacroHandler() macro_handler.add_macros(MACROS, p) stream = StringIO() # Parse m4 p.parse(stream=stream) shell = stream.getvalue() if len(sys.argv) > 1: sys.stdout.write(shell) sys.exit(0) # now translate shell to Python template_file = os.path.join(os.path.dirname(__file__), 'template.py') template = ast.parse(open(template_file, 'r').read())
def test_macro_args_nested_parens(self): p = Parser('foo(abc(xyz)abc)') p.define('foo', 'bar') self.assertEqual(self.parse(p), 'bar')
def test_define_argparse(self): p = Parser('define( abc, xyz)abc') self.assertEqual(self.parse(p), 'xyz')
def test_changequote(self): p = Parser("`abc'[xyz]") p.changequote('[', ']') self.assertEqual(self.parse(p), "`abc'xyz")
def test_define_recursive(self): p = Parser('abc') p.define('abc', 'xyz') p.define('xyz', '123') self.assertEqual(self.parse(p), '123')
def test_define_simple_trailing(self): p = Parser('abc ') p.define('abc', 'xyz') self.assertEqual(self.parse(p), 'xyz ')
def test_define_empty(self): p = Parser('abc') p.define('abc') self.assertEqual(self.parse(p), '')
def test_empty_string(self): p = Parser("`'") self.assertEqual(self.parse(p), '')
def test_basic(self): p = Parser('abc') self.assertEqual(self.parse(p), 'abc')