Exemple #1
0
        public async Task <IReadOnlyList <(ITemplatePackageInfo PackageInfo, IReadOnlyList <ITemplateInfo> MatchedTemplates)> > SearchForTemplatePackagesAsync(
            Func <TemplatePackageSearchData, bool> packFilter,
            Func <TemplatePackageSearchData, IReadOnlyList <ITemplateInfo> > matchingTemplatesFilter,
            CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (_searchCache == null)
            {
                _logger.LogDebug("Initializing search cache...");
                string metadataLocation = await GetSearchFileAsync(cancellationToken).ConfigureAwait(false);

                _searchCache = TemplateSearchCache.FromJObject(_environmentSettings.Host.FileSystem.ReadObject(metadataLocation), _logger, _additionalDataReaders);
                _logger.LogDebug("Search cache was successfully setup.");
            }

            IEnumerable <TemplatePackageSearchData> filteredPackages = _searchCache.TemplatePackages.Where(package => packFilter(package));

            _logger.LogDebug("Retrieved {0} packages matching package search criteria.", filteredPackages.Count());

            List <(ITemplatePackageInfo PackageInfo, IReadOnlyList <ITemplateInfo> MatchedTemplates)> matchingTemplates = filteredPackages
                                                                                                                          .Select <TemplatePackageSearchData, (ITemplatePackageInfo PackageInfo, IReadOnlyList <ITemplateInfo> MatchedTemplates)>(package => (package, matchingTemplatesFilter(package)))
                                                                                                                          .Where(result => result.MatchedTemplates.Any())
                                                                                                                          .ToList();

            _logger.LogDebug("Retrieved {0} packages matching template search criteria.", matchingTemplates.Count);
            return(matchingTemplates);
        }
        private static void WriteSearchMetadata(PackSourceCheckResult packSourceCheckResults, string outputFileName)
        {
            TemplateSearchCache searchMetadata = packSourceCheckResults.SearchCache;

            File.WriteAllText(outputFileName, searchMetadata.ToJObject().ToString(Formatting.None));
            Console.WriteLine($"Search cache file created: {outputFileName}");
        }
Exemple #3
0
        private static string SetupInvalidTemplateCache(string fileLocation)
        {
            var packOne = new TemplatePackageSearchData(new MockTemplatePackageInfo("PackOne", "1.0.0"), new[] { new TemplateSearchData(new MockTemplateInfo("foo", "foo", "foo").WithParameters("Config type", "Main type", "unknown")) });
            var cache   = new TemplateSearchCache(new[] { packOne });

            JObject toSerialize = JObject.FromObject(cache);
            string  targetPath  = Path.Combine(fileLocation, "searchCacheV2.json");

            File.WriteAllText(targetPath, toSerialize.ToString());
            return(targetPath);
        }
        public void CanSkipInvalidEntriesSearchMetadata()
        {
            var     environmentSettings = _environmentSettingsHelper.CreateEnvironment(virtualize: true);
            string  content             = File.ReadAllText("NuGetTemplateSearchInfoWithInvalidData.json");
            JObject cache = JObject.Parse(content);

            var parsedCache = TemplateSearchCache.FromJObject(cache, environmentSettings.Host.Logger);

            Assert.Equal(1, parsedCache.TemplatePackages.Count);
            Assert.Equal(1, parsedCache.TemplatePackages.Sum(p => p.Templates.Count));

            Assert.IsAssignableFrom <ITemplateInfo>(parsedCache.TemplatePackages[0].Templates[0]);
            Assert.Equal("Microsoft.AzureFunctions.ProjectTemplate.CSharp.3.x", ((ITemplateInfo)parsedCache.TemplatePackages[0].Templates[0]).Identity);
        }
Exemple #5
0
        private string GenerateLocalCache()
        {
            ITemplatePackageInfo packOneInfo   = new MockTemplatePackageInfo("PackOne", "1.0.0");
            ITemplatePackageInfo packTwoInfo   = new MockTemplatePackageInfo("PackTwo", "1.6.0");
            ITemplatePackageInfo packThreeInfo = new MockTemplatePackageInfo("PackThree", "2.1");

            ITemplateInfo fooOneTemplate =
                new MockTemplateInfo("foo1", name: "MockFooTemplateOne", identity: "Mock.Foo.1", groupIdentity: "Mock.Foo", author: "TestAuthor")
                .WithClassifications("CSharp", "Library")
                .WithDescription("Mock Foo template one")
                .WithChoiceParameter("Framework", "netcoreapp3.0", "netcoreapp3.1")
                .WithTag("language", "C#")
                .WithTag("type", "project");

            ITemplateInfo fooTwoTemplate =
                new MockTemplateInfo("foo2", name: "MockFooTemplateTwo", identity: "Mock.Foo.2", groupIdentity: "Mock.Foo")
                .WithClassifications("CSharp", "Console")
                .WithDescription("Mock Foo template two")
                .WithChoiceParameter("Framework", "netcoreapp2.0", "netcoreapp2.1", "netcoreapp3.1")
                .WithTag("language", "C#");

            ITemplateInfo barCSharpTemplate =
                new MockTemplateInfo("barC", name: "MockBarCsharpTemplate", identity: "Mock.Bar.1.Csharp", groupIdentity: "Mock.Bar")
                .WithClassifications("CSharp")
                .WithDescription("Mock Bar CSharp template")
                .WithTag("language", "C#");

            ITemplateInfo barFSharpTemplate =
                new MockTemplateInfo("barF", name: "MockBarFSharpTemplate", identity: "Mock.Bar.1.FSharp", groupIdentity: "Mock.Bar")
                .WithClassifications("FSharp")
                .WithDescription("Mock Bar FSharp template")
                .WithTag("language", "F#");

            var fooOneTemplateData    = new TemplateSearchData(fooOneTemplate);
            var fooTwoTemplateData    = new TemplateSearchData(fooTwoTemplate);
            var barCSharpTemplateData = new TemplateSearchData(barCSharpTemplate);
            var barFSharpTemplateData = new TemplateSearchData(barFSharpTemplate);

            var packOne   = new TemplatePackageSearchData(packOneInfo, new[] { fooOneTemplateData });
            var packTwo   = new TemplatePackageSearchData(packTwoInfo, new[] { fooTwoTemplateData });
            var packThree = new TemplatePackageSearchData(packThreeInfo, new[] { barCSharpTemplateData, barFSharpTemplateData });

            var cache = new TemplateSearchCache(new[] { packOne, packTwo, packThree });

            string targetPath = Path.Combine(TestUtils.CreateTemporaryFolder(), "searchCacheV2.json");

            File.WriteAllText(targetPath, cache.ToJObject().ToString());
            return(targetPath);
        }
Exemple #6
0
#pragma warning restore CS0618 // Type or member is obsolete

        private static string SetupTemplateCache(string fileLocation, bool includehostData = false)
        {
            Dictionary <string, string> frameworkParamSymbolInfo = new Dictionary <string, string>()
            {
                { "longName", "framework" },
                { "shortName", "f" }
            };

            HostSpecificTemplateData fooTemplateHostData = new MockHostSpecificTemplateData(
                new Dictionary <string, IReadOnlyDictionary <string, string> >()
            {
                { "Framework", frameworkParamSymbolInfo }
            }
                );

            Dictionary <string, object> additionalData = new Dictionary <string, object>()
            {
                { CliHostSearchCacheData.DataName, fooTemplateHostData }
            };
            List <ITemplateInfo> templateCache = new List <ITemplateInfo>();

            templateCache.Add(_fooOneTemplate);
            templateCache.Add(_fooTwoTemplate);
            templateCache.Add(_barCSharpTemplate);
            templateCache.Add(_barFSharpTemplate);

            var fooOneTemplateData    = new TemplateSearchData(_fooOneTemplate, includehostData ? additionalData : null);
            var fooTwoTemplateData    = new TemplateSearchData(_fooTwoTemplate, includehostData ? additionalData : null);
            var barCSharpTemplateData = new TemplateSearchData(_barCSharpTemplate, null);
            var barFSharpTemplateData = new TemplateSearchData(_barFSharpTemplate, null);

            var packOne   = new TemplatePackageSearchData(_packOneInfo, new[] { fooOneTemplateData });
            var packTwo   = new TemplatePackageSearchData(_packTwoInfo, new[] { fooTwoTemplateData });
            var packThree = new TemplatePackageSearchData(_packThreeInfo, new[] { barCSharpTemplateData, barFSharpTemplateData });

            var cache = new TemplateSearchCache(new[] { packOne, packTwo, packThree });

            JObject toSerialize = JObject.FromObject(cache);
            string  targetPath  = Path.Combine(fileLocation, "searchCacheV2.json");

            File.WriteAllText(targetPath, toSerialize.ToString());
            return(targetPath);
        }
        public void CanReadSearchMetadata()
        {
            var     environmentSettings = _environmentSettingsHelper.CreateEnvironment(virtualize: true);
            string  content             = File.ReadAllText("NuGetTemplateSearchInfo.json");
            JObject cache = JObject.Parse(content);

            var parsedCache = TemplateSearchCache.FromJObject(cache, environmentSettings.Host.Logger);

            Assert.Equal(1, parsedCache.TemplatePackages.Count);
            Assert.Equal(2, parsedCache.TemplatePackages.Sum(p => p.Templates.Count));

            Assert.IsAssignableFrom <ITemplateInfo>(parsedCache.TemplatePackages[0].Templates[0]);

            //can read tags
            Assert.Equal(2, ((ITemplateInfo)parsedCache.TemplatePackages[0].Templates[0]).TagsCollection.Count);

            //can read parameters
            Assert.Equal(5, ((ITemplateInfo)parsedCache.TemplatePackages[0].Templates[0]).Parameters.Count);
        }
        private static TemplateSearchCache?LoadExistingCache(CommandArgs config)
        {
            if (!config.DiffMode || config.DiffOverrideSearchCacheLocation == null)
            {
                return(null);
            }

            FileInfo?cacheFileLocation = config.DiffOverrideSearchCacheLocation;

            Verbose.WriteLine($"Opening {cacheFileLocation.FullName}");
            using (var fileStream = cacheFileLocation.OpenRead())
                using (var textReader = new StreamReader(fileStream, System.Text.Encoding.UTF8, true))
                    using (var jsonReader = new JsonTextReader(textReader))
                    {
                        return(TemplateSearchCache.FromJObject(JObject.Load(jsonReader), NullLogger.Instance, new Dictionary <string, Func <object, object> >()
                        {
                            { CliHostSearchCacheData.DataName, CliHostSearchCacheData.Reader }
                        }));
                    }
        }
Exemple #9
0
        private static async Task <TemplateSearchCache?> LoadExistingCacheAsync(CommandArgs config, CancellationToken cancellationToken)
        {
            Verbose.WriteLine($"Loading existing cache information.");
            const string uri = "https://dotnet-templating.azureedge.net/search/NuGetTemplateSearchInfoVer2.json";

            FileInfo?cacheFileLocation = config.DiffOverrideSearchCacheLocation;

            if (cacheFileLocation == null)
            {
                await DownloadUriToFileAsync(uri, "currentSearchCache.json", cancellationToken).ConfigureAwait(false);

                cacheFileLocation = new FileInfo("currentSearchCache.json");
            }
            Verbose.WriteLine($"Opening {cacheFileLocation.FullName}");
            using (var fileStream = cacheFileLocation.OpenRead())
                using (var textReader = new StreamReader(fileStream, System.Text.Encoding.UTF8, true))
                    using (var jsonReader = new JsonTextReader(textReader))
                    {
                        return(TemplateSearchCache.FromJObject(JObject.Load(jsonReader), NullLogger.Instance, new Dictionary <string, Func <object, object> >()
                        {
                            { CliHostSearchCacheData.DataName, CliHostSearchCacheData.Reader }
                        }));
                    }
        }
 internal PackSourceCheckResult(TemplateSearchCache generatedSearchCache, IReadOnlyList <FilteredPackageInfo> filteredPackages, IReadOnlyList <IAdditionalDataProducer> additionalDataHandlers)
 {
     SearchCache             = generatedSearchCache;
     FilteredPackages        = filteredPackages;
     AdditionalDataProducers = additionalDataHandlers;
 }