public async ValueTask <PackageDeprecationMetadataContextInfo?> GetDeprecationMetadataAsync( PackageIdentity identity, IReadOnlyCollection <PackageSourceContextInfo> packageSources, bool includePrerelease, CancellationToken cancellationToken) { Assumes.NotNull(identity); Assumes.NotNullOrEmpty(packageSources); string cacheId = PackageSearchMetadataCacheItem.GetCacheId(identity.Id, includePrerelease, packageSources); PackageSearchMetadataCacheItem?backgroundDataCache = PackageSearchMetadataMemoryCache.Get(cacheId) as PackageSearchMetadataCacheItem; if (backgroundDataCache != null) { PackageSearchMetadataCacheItemEntry cacheItem = await backgroundDataCache.GetPackageSearchMetadataCacheVersionedItemAsync(identity, cancellationToken); return(await cacheItem.PackageDeprecationMetadataContextInfo); } IPackageMetadataProvider packageMetadataProvider = await GetPackageMetadataProviderAsync(packageSources, cancellationToken); IPackageSearchMetadata packageMetadata = await packageMetadataProvider.GetPackageMetadataAsync(identity, includePrerelease, cancellationToken); PackageDeprecationMetadata deprecationMetadata = await packageMetadata.GetDeprecationMetadataAsync(); if (deprecationMetadata == null) { return(null); } return(PackageDeprecationMetadataContextInfo.Create(deprecationMetadata)); }
public static PackageDeprecationMetadataContextInfo Create(PackageDeprecationMetadata packageDeprecationMetadata) { return(new PackageDeprecationMetadataContextInfo( packageDeprecationMetadata.Message, packageDeprecationMetadata.Reasons?.ToList(), packageDeprecationMetadata.AlternatePackage != null ? AlternatePackageMetadataContextInfo.Create(packageDeprecationMetadata.AlternatePackage) : null)); }
public DetailedPackageMetadata(IPackageSearchMetadata serverData, PackageDeprecationMetadata deprecationMetadata, long?downloadCount) { Id = serverData.Identity.Id; Version = serverData.Identity.Version; Summary = serverData.Summary; Description = serverData.Description; Authors = serverData.Authors; Owners = serverData.Owners; IconUrl = serverData.IconUrl; LicenseUrl = serverData.LicenseUrl; ProjectUrl = serverData.ProjectUrl; ReportAbuseUrl = serverData.ReportAbuseUrl; // Some server implementations send down an array with an empty string, which ends up as an empty string. // In PM UI, we want Tags to work like most other properties from the server (Authors/Owners), and be null, if there is no value. Tags = string.IsNullOrEmpty(serverData.Tags) ? null : serverData.Tags; DownloadCount = downloadCount; Published = serverData.Published; IEnumerable <PackageDependencyGroup> dependencySets = serverData.DependencySets; if (dependencySets != null && dependencySets.Any()) { DependencySets = dependencySets.Select(e => new PackageDependencySetMetadata(e)).ToArray(); } else { DependencySets = NoDependenciesPlaceholder; } PrefixReserved = serverData.PrefixReserved; LicenseMetadata = serverData.LicenseMetadata; DeprecationMetadata = deprecationMetadata; Vulnerabilities = serverData.Vulnerabilities; _localMetadata = serverData as LocalPackageSearchMetadata; // Determine the package details URL and text. PackageDetailsUrl = null; PackageDetailsText = null; if (serverData.PackageDetailsUrl != null && serverData.PackageDetailsUrl.IsAbsoluteUri && serverData.PackageDetailsUrl.Host != null) { PackageDetailsUrl = serverData.PackageDetailsUrl; PackageDetailsText = serverData.PackageDetailsUrl.Host; // Special case the subdomain "www." - we hide it. Other subdomains are not hidden. const string wwwDot = "www."; if (PackageDetailsText.StartsWith(wwwDot, StringComparison.OrdinalIgnoreCase) && PackageDetailsText.Length > wwwDot.Length) { PackageDetailsText = PackageDetailsText.Substring(wwwDot.Length); } } }
public DetailedPackageMetadata(IPackageSearchMetadata serverData, PackageDeprecationMetadata deprecationMetadata, long?downloadCount) { Id = serverData.Identity.Id; Version = serverData.Identity.Version; Summary = serverData.Summary; Description = serverData.Description; Authors = serverData.Authors; Owners = serverData.Owners; IconUrl = serverData.IconUrl; LicenseUrl = serverData.LicenseUrl; ProjectUrl = serverData.ProjectUrl; ReportAbuseUrl = serverData.ReportAbuseUrl; Tags = serverData.Tags; DownloadCount = downloadCount; Published = serverData.Published; DependencySets = serverData.DependencySets? .Select(e => new PackageDependencySetMetadata(e)) ?? new PackageDependencySetMetadata[] { }; HasDependencies = DependencySets.Any( dependencySet => dependencySet.Dependencies != null && dependencySet.Dependencies.Count > 0); PrefixReserved = serverData.PrefixReserved; LicenseMetadata = serverData.LicenseMetadata; DeprecationMetadata = deprecationMetadata; _localMetadata = serverData as LocalPackageSearchMetadata; // Determine the package details URL and text. PackageDetailsUrl = null; PackageDetailsText = null; if (serverData.PackageDetailsUrl != null && serverData.PackageDetailsUrl.IsAbsoluteUri && serverData.PackageDetailsUrl.Host != null) { PackageDetailsUrl = serverData.PackageDetailsUrl; PackageDetailsText = serverData.PackageDetailsUrl.Host; // Special case the subdomain "www." - we hide it. Other subdomains are not hidden. const string wwwDot = "www."; if (PackageDetailsText.StartsWith(wwwDot, StringComparison.OrdinalIgnoreCase) && PackageDetailsText.Length > wwwDot.Length) { PackageDetailsText = PackageDetailsText.Substring(wwwDot.Length); } } }
public async Task GetLocalPackageMetadataAsync_WhenLocalSourceHasPackage_CombinesMetadata() { // Arrange Mock.Get(_localMetadataResource) .Setup(x => x.GetMetadataAsync(TestPackageIdentity.Id, true, true, It.IsAny <SourceCacheContext>(), It.IsAny <Common.ILogger>(), It.IsAny <CancellationToken>())) .ReturnsAsync(new[] { PackageSearchMetadataBuilder.FromIdentity(TestPackageIdentity).Build() }); var expectedVersionStrings = new[] { "1.0.0", "2.0.0" }; var deprecationMetadata = new PackageDeprecationMetadata(); Mock.Get(_metadataResource) .Setup(x => x.GetMetadataAsync(TestPackageIdentity.Id, true, false, It.IsAny <SourceCacheContext>(), It.IsAny <Common.ILogger>(), It.IsAny <CancellationToken>())) .ReturnsAsync( new[] { PackageSearchMetadataBuilder .FromIdentity(TestPackageIdentity) .WithDeprecation(new AsyncLazy <PackageDeprecationMetadata>(() => Task.FromResult(deprecationMetadata))) .Build(), PackageSearchMetadataBuilder .FromIdentity(new PackageIdentity(TestPackageIdentity.Id, new NuGetVersion("2.0.0"))) .Build() }); // Act var metadata = await _target.GetLocalPackageMetadataAsync( TestPackageIdentity, includePrerelease : true, cancellationToken : CancellationToken.None); // Assert Mock.Get(_metadataResource).Verify( x => x.GetMetadataAsync(TestPackageIdentity.Id, true, false, It.IsAny <SourceCacheContext>(), It.IsAny <Common.ILogger>(), It.IsAny <CancellationToken>()), Times.Once); Assert.Equal(expectedVersionStrings, (await metadata.GetVersionsAsync()).Select(v => v.Version.ToString()).OrderBy(v => v)); Assert.Same(deprecationMetadata, await metadata.GetDeprecationMetadataAsync()); }
private static string PrintDeprecationReasons(PackageDeprecationMetadata deprecationMetadata) { return(deprecationMetadata == null ? string.Empty : string.Join(",", deprecationMetadata.Reasons)); }