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));
        }
Beispiel #2
0
 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);
                }
            }
        }
Beispiel #5
0
            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));
 }