예제 #1
0
파일: main.py 프로젝트: classyserve/pytype
def main():
    parser = parse_args.make_parser()
    args = parser.parse_args(sys.argv[1:])

    if args.version:
        print(io.get_pytype_version())
        sys.exit(0)

    tool_utils.setup_logging_or_die(args.verbosity)

    if args.generate_config:
        config.generate_sample_config_or_die(args.generate_config)
        sys.exit(0)

    args.filenames = file_utils.expand_source_files(args.filenames)
    conf = parser.config_from_defaults()
    # File options overwrite defaults.
    file_config = config.read_config_file_or_die(args.config)
    parser.postprocess(file_config, from_strings=True)
    conf.populate_from(file_config)
    # Command line arguments overwrite file options.
    conf.populate_from(args)
    if not conf.pythonpath:
        conf.pythonpath = environment.compute_pythonpath(args.filenames)
    logging.info('\n  '.join(['Configuration:'] + str(conf).split('\n')))

    if not args.filenames:
        parser.parser.print_usage()
        sys.exit(0)

    # Importlab needs the python exe, so we check it as early as possible.
    environment.check_python_exe_or_die(conf.python_version)

    typeshed = environment.initialize_typeshed_or_die()
    env = create_importlab_environment(conf, typeshed)
    try:
        import_graph = importlab.graph.ImportGraph.create(env, args.filenames)
    except Exception as e:  # pylint: disable=broad-except
        logging.critical('Cannot parse input files:\n%s', str(e))
        sys.exit(1)

    if args.tree:
        print('Source tree:')
        importlab.output.print_tree(import_graph)
        sys.exit(0)

    if args.unresolved:
        print('Unresolved dependencies:')
        for imp in sorted(import_graph.get_all_unresolved()):
            print(' ', imp.name)
        sys.exit(0)

    logging.info('Source tree:\n%s',
                 importlab.output.formatted_deps_list(import_graph))
    tool_utils.makedirs_or_die(conf.output,
                               'Could not create output directory')
    deps = pytype_runner.deps_from_import_graph(import_graph)
    runner = pytype_runner.PytypeRunner(args.filenames, deps, conf)
    runner.run()
예제 #2
0
def main():
  parser = parse_args.make_parser()
  args = parser.parse_args(sys.argv[1:])

  if args.version:
    print(io.get_pytype_version())
    sys.exit(0)

  tool_utils.setup_logging_or_die(args.verbosity)

  if args.generate_config:
    config.generate_sample_config_or_die(args.generate_config,
                                         parser.pytype_single_args)
    sys.exit(0)

  conf = parser.config_from_defaults()
  # File options overwrite defaults.
  file_config = config.read_config_file_or_die(args.config)
  parser.postprocess(file_config, from_strings=True)
  conf.populate_from(file_config)
  # Command line arguments overwrite file options.
  conf.populate_from(args)
  conf.inputs -= conf.exclude
  if args.no_cache:
    conf.output = tempfile.mkdtemp()
  if not conf.pythonpath:
    conf.pythonpath = environment.compute_pythonpath(conf.inputs)
  logging.info('\n  '.join(['Configuration:'] + str(conf).split('\n')))

  if not conf.inputs:
    parser.parser.error('Need an input.')

  # Importlab needs the python exe, so we check it as early as possible.
  environment.check_python_exe_or_die(conf.python_version)

  typeshed = environment.initialize_typeshed_or_die()
  env = analyze_project_env.create_importlab_environment(conf, typeshed)
  print('Computing dependencies')
  import_graph = importlab.graph.ImportGraph.create(env, conf.inputs, trim=True)

  if args.tree:
    print('Source tree:')
    importlab.output.print_tree(import_graph)
    sys.exit(0)

  if args.unresolved:
    print('Unresolved dependencies:')
    for imp in sorted(import_graph.get_all_unresolved()):
      print(' ', imp.name)
    sys.exit(0)

  # Main usage mode: analyze the project file by file in dependency order.

  logging.info('Source tree:\n%s',
               importlab.output.formatted_deps_list(import_graph))
  tool_utils.makedirs_or_die(conf.output, 'Could not create output directory')
  deps = pytype_runner.deps_from_import_graph(import_graph)
  runner = pytype_runner.PytypeRunner(conf, deps)
  return runner.run()
예제 #3
0
 def testBasic(self):
   deps = pytype_runner.deps_from_import_graph(self.graph)
   expected = [
       [Module('/foo/', 'bar/__init__.py', 'bar.__init__')],
       [Module('/foo/', 'bar/a.py', 'bar.a')],
       [Module('/foo/', 'bar/b.py', 'bar.b')]
   ]
   self.assertEqual(deps, expected)
예제 #4
0
 def test_basic(self):
     graph = FakeImportGraph(self.sources, self.provenance,
                             collections.defaultdict(list))
     deps = pytype_runner.deps_from_import_graph(graph)
     expected = [
         ((Module('/foo/', 'bar/__init__.py', 'bar.__init__'), ), ()),
         ((Module('/foo/', 'bar/a.py', 'bar.a'), ), ()),
         ((Module('/foo/', 'bar/b.py', 'bar.b'), ), ()),
     ]
     self.assertEqual(deps, expected)
예제 #5
0
 def test_pyi_dep(self):
   pyi_mod = ImportlabModule('/foo/bar/c.pyi', 'bar/c.pyi', 'bar.c')
   graph = FakeImportGraph(self.sources, self.provenance,
                           collections.defaultdict(lambda: [pyi_mod.path]))
   deps = pytype_runner.deps_from_import_graph(graph)
   expected = [
       ((Module('/foo/', 'bar/__init__.py', 'bar.__init__'),), ()),
       ((Module('/foo/', 'bar/a.py', 'bar.a'),), ()),
       ((Module('/foo/', 'bar/b.py', 'bar.b'),), ()),
   ]
   self.assertEqual(deps, expected)
예제 #6
0
 def test_duplicate_deps(self):
     graph = FakeImportGraph(
         self.sources, self.provenance,
         collections.defaultdict(lambda: [self.sources[0]] * 2))
     deps = pytype_runner.deps_from_import_graph(graph)
     init = Module('/foo/', 'bar/__init__.py', 'bar.__init__')
     expected = [
         ((init, ), (init, )),
         ((Module('/foo/', 'bar/a.py', 'bar.a'), ), (init, )),
         ((Module('/foo/', 'bar/b.py', 'bar.b'), ), (init, )),
     ]
     self.assertEqual(deps, expected)