示例#1
0
        private async Task FullStdLibTest(PythonVersion v, params string[] skipModules)
        {
            v.AssertInstalled();
            var factory = new AstPythonInterpreterFactory(v.Configuration, new InterpreterFactoryCreationOptions {
                DatabasePath     = TestData.GetTempPath(),
                UseExistingCache = false
            });
            var modules = ModulePath.GetModulesInLib(v.PrefixPath).ToList();

            var skip = new HashSet <string>(skipModules);

            skip.UnionWith(new[] {
                "matplotlib.backends._backend_gdk",
                "matplotlib.backends._backend_gtkagg",
                "matplotlib.backends._gtkagg",
            });

            bool anySuccess = false;
            bool anyExtensionSuccess = false, anyExtensionSeen = false;
            bool anyParseError = false;

            using (var analyzer = new PythonAnalysis(factory)) {
                try {
                    var tasks = new List <Task <Tuple <ModulePath, IPythonModule> > >();

                    var interp = (AstPythonInterpreter)analyzer.Analyzer.Interpreter;
                    foreach (var m in skip)
                    {
                        interp.AddUnimportableModule(m);
                    }

                    foreach (var r in modules
                             .Where(m => !skip.Contains(m.ModuleName))
                             .GroupBy(m => {
                        int i = m.FullName.IndexOf('.');
                        return(i <= 0 ? m.FullName : m.FullName.Remove(i));
                    })
                             .AsParallel()
                             .SelectMany(g => g.Select(m => Tuple.Create(m, interp.ImportModule(m.ModuleName))))
                             )
                    {
                        var modName = r.Item1;
                        var mod     = r.Item2;

                        anyExtensionSeen |= modName.IsNativeExtension;
                        if (mod == null)
                        {
                            Trace.TraceWarning("failed to import {0} from {1}", modName.ModuleName, modName.SourceFile);
                        }
                        else if (mod is AstScrapedPythonModule smod)
                        {
                            if (smod.ParseErrors?.Any() ?? false)
                            {
                                anyParseError = true;
                                Trace.TraceError("Parse errors in {0}", modName.SourceFile);
                                foreach (var e in smod.ParseErrors)
                                {
                                    Trace.TraceError(e);
                                }
                            }
                            else
                            {
                                anySuccess           = true;
                                anyExtensionSuccess |= modName.IsNativeExtension;
                                mod.GetMemberNames(analyzer.ModuleContext).ToList();
                            }
                        }
                        else if (mod is AstPythonModule)
                        {
                            // pass
                        }
                        else
                        {
                            Trace.TraceError("imported {0} as type {1}", modName.ModuleName, mod.GetType().FullName);
                        }
                    }
                } finally {
                    _analysisLog = analyzer.GetLogContent(CultureInfo.InvariantCulture);
                }
            }
            Assert.IsTrue(anySuccess, "failed to import any modules at all");
            Assert.IsTrue(anyExtensionSuccess || !anyExtensionSeen, "failed to import all extension modules");
            Assert.IsFalse(anyParseError, "parse errors occurred");
        }