Example #1
0
    def setUp(self):
        self.rootdir = tempfile.mkdtemp()
        self.pydir = os.path.join(self.rootdir, 'src', '__python__')
        self._materialize_tree(self.rootdir,
                               {'src/': {
                                   '__python__/': self._PATH_SPEC
                               }})
        foo_script = os.path.join(self.rootdir, 'foo.py')
        self.importer = imputil.Importer(self.rootdir, 'foo', foo_script,
                                         False)
        bar_script = os.path.join(self.pydir, 'bar', '__init__.py')
        self.bar_importer = imputil.Importer(self.rootdir, 'bar', bar_script,
                                             False)
        fred_script = os.path.join(self.pydir, 'bar', 'fred', '__init__.py')
        self.fred_importer = imputil.Importer(self.rootdir, 'bar.fred',
                                              fred_script, False)

        self.foo_import = imputil.Import('foo',
                                         os.path.join(self.pydir, 'foo.py'))
        self.qux_import = imputil.Import('qux',
                                         os.path.join(self.pydir, 'qux.py'))
        self.bar_import = imputil.Import(
            'bar', os.path.join(self.pydir, 'bar/__init__.py'))
        self.fred_import = imputil.Import(
            'bar.fred', os.path.join(self.pydir, 'bar/fred/__init__.py'))
        self.quux_import = imputil.Import(
            'bar.fred.quux', os.path.join(self.pydir, 'bar/fred/quux.py'))
        self.baz2_import = imputil.Import(
            'bar.baz', os.path.join(self.pydir, 'bar/baz.py'))
        self.foo2_import = imputil.Import(
            'bar.foo', os.path.join(self.pydir, 'bar/foo.py'))
        self.baz_import = imputil.Import('baz',
                                         os.path.join(self.pydir, 'baz.py'))
Example #2
0
 def testRelativeModuleFromSubModule(self):
     imp = copy.deepcopy(self.foo2_import)
     imp.add_binding(imputil.Import.MODULE, 'foo', 1)
     baz_script = os.path.join(self.pydir, 'bar', 'baz.py')
     importer = imputil.Importer(self.rootdir, 'bar.baz', baz_script, False)
     node = pythonparser.parse('from . import foo').body[0]
     self._assert_imports_equal([imp], importer.visit(node))
Example #3
0
 def testImportPackageModuleAbsoluteImport(self):
     imp = copy.deepcopy(self.baz_import)
     imp.add_binding(imputil.Import.MODULE, 'baz', 0)
     bar_script = os.path.join(self.pydir, 'bar', '__init__.py')
     importer = imputil.Importer(self.rootdir, 'bar', bar_script, True)
     got = importer.visit(pythonparser.parse('import baz').body[0])
     self._assert_imports_equal([imp], got)
Example #4
0
 def testImportPackageModuleRelativeFromSubModule(self):
     imp = copy.deepcopy(self.baz2_import)
     imp.add_binding(imputil.Import.MODULE, 'baz', 1)
     foo_script = os.path.join(self.pydir, 'bar', 'foo.py')
     importer = imputil.Importer(self.rootdir, 'bar.foo', foo_script, False)
     got = importer.visit(pythonparser.parse('import baz').body[0])
     self._assert_imports_equal([imp], got)
Example #5
0
 def setUp(self):
     self.rootdir = tempfile.mkdtemp()
     self.pydir = os.path.join(self.rootdir, 'src', '__python__')
     self._materialize_tree(self.rootdir,
                            {'src/': {
                                '__python__/': self._PATH_SPEC
                            }})
     foo_script = os.path.join(self.rootdir, 'foo.py')
     self.importer = imputil.Importer(self.rootdir, 'foo', foo_script,
                                      False)
     bar_script = os.path.join(self.pydir, 'bar', '__init__.py')
     self.bar_importer = imputil.Importer(self.rootdir, 'bar', bar_script,
                                          False)
     fred_script = os.path.join(self.pydir, 'bar', 'fred', '__init__.py')
     self.fred_importer = imputil.Importer(self.rootdir, 'bar.fred',
                                           fred_script, False)
Example #6
0
def _ParseAndVisit(source):
  mod = pythonparser.parse(source)
  _, future_features = imputil.parse_future_features(mod)
  importer = imputil.Importer(None, 'foo', 'foo.py', False)
  b = block.ModuleBlock(importer, '__main__', '<test>',
                        source, future_features)
  visitor = stmt.StatementVisitor(b)
  visitor.visit(mod)
  return visitor
Example #7
0
def _MakeModuleBlock():
  importer = imputil.Importer(None, '__main__', '/tmp/foo.py', False)
  return block.ModuleBlock(importer, '__main__', '<test>', '',
                           imputil.FutureFeatures())
Example #8
0
 def testImportEmptyPath(self):
     importer = imputil.Importer(None, 'foo', 'foo.py', False)
     self.assertRaises(util.ImportError, importer.visit,
                       pythonparser.parse('import bar').body[0])
Example #9
0
def main(script=None, modname=None):
    assert script and modname, 'Script "%s" or Modname "%s" is empty' % (
        script, modname)

    gopath = os.getenv('GOPATH', None)
    if not gopath:
        print >> sys.stderr, 'GOPATH not set'
        return 1

    with open(script) as py_file:
        py_contents = py_file.read()
    try:
        mod = pythonparser.parse(py_contents)
    except SyntaxError as e:
        print >> sys.stderr, '{}: line {}: invalid syntax: {}'.format(
            e.filename, e.lineno, e.text)
        return 2

    # Do a pass for compiler directives from `from __future__ import *` statements
    try:
        future_node, future_features = imputil.parse_future_features(mod)
    except util.CompileError as e:
        print >> sys.stderr, str(e)
        return 2

    importer = imputil.Importer(gopath, modname, script,
                                future_features.absolute_import)
    full_package_name = modname.replace('.', '/')
    mod_block = block.ModuleBlock(importer, full_package_name, script,
                                  py_contents, future_features)

    visitor = stmt.StatementVisitor(mod_block, future_node)
    # Indent so that the module body is aligned with the goto labels.
    with visitor.writer.indent_block():
        try:
            visitor.visit(mod)
        except util.ParseError as e:
            print >> sys.stderr, str(e)
            return 2

    writer = util.Writer(sys.stdout)
    tmpl = textwrap.dedent("""\
      package $package
      import πg "grumpy"
      var Code *πg.Code
      func init() {
      \tCode = πg.NewCode("<module>", $script, nil, 0, func(πF *πg.Frame, _ []*πg.Object) (*πg.Object, *πg.BaseException) {
      \t\tvar πR *πg.Object; _ = πR
      \t\tvar πE *πg.BaseException; _ = πE""")
    writer.write_tmpl(tmpl,
                      package=modname.split('.')[-1],
                      script=util.go_str(script))
    with writer.indent_block(2):
        for s in sorted(mod_block.strings):
            writer.write('ß{} := πg.InternStr({})'.format(s, util.go_str(s)))
        writer.write_temp_decls(mod_block)
        writer.write_block(mod_block, visitor.writer.getvalue())
    writer.write_tmpl(textwrap.dedent("""\
    \t\treturn nil, πE
    \t})
    \tπg.RegisterModule($modname, Code)
    }"""),
                      modname=util.go_str(modname))
    return 0