Skip to content

Commit d01e48a

Browse files
authored
Protocol loads Owners from package sources as an enumerable type (#5751)
1 parent 95b7931 commit d01e48a

22 files changed

Lines changed: 920 additions & 103 deletions

src/NuGet.Clients/NuGet.VisualStudio.Internal.Contracts/TransitivePackageSearchMetadata.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ public class TransitivePackageSearchMetadata : IPackageSearchMetadata
3939

4040
public DateTimeOffset? Published => _packageSearchMetadata.Published;
4141

42+
public IReadOnlyList<string> OwnersList => _packageSearchMetadata.OwnersList;
43+
4244
public string Owners => _packageSearchMetadata.Owners;
4345

4446
public bool RequireLicenseAcceptance => _packageSearchMetadata.RequireLicenseAcceptance;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using Newtonsoft.Json;
6+
7+
namespace NuGet.Protocol
8+
{
9+
internal class MetadataStringOrArrayConverter : JsonConverter
10+
{
11+
public override bool CanConvert(Type objectType) => (objectType == typeof(string) || objectType == typeof(string[]));
12+
13+
public override bool CanWrite => false;
14+
15+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
16+
{
17+
if (reader.TokenType == JsonToken.Null || reader.TokenType == JsonToken.None)
18+
{
19+
return string.Empty;
20+
}
21+
22+
if (reader.TokenType == JsonToken.String)
23+
{
24+
var str = serializer.Deserialize<string>(reader);
25+
return string.IsNullOrWhiteSpace(str) ? null : new string[] { str };
26+
}
27+
28+
return serializer.Deserialize<string[]>(reader);
29+
}
30+
31+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
32+
{
33+
throw new NotImplementedException();
34+
}
35+
}
36+
}

src/NuGet.Core/NuGet.Protocol/GlobalSuppressions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,3 +230,4 @@
230230
[assembly: SuppressMessage("Globalization", "CA1308:Normalize strings to uppercase", Justification = "We convert packageId to lower case for api call.", Scope = "member", Target = "~M:NuGet.Protocol.PackageMetadataResourceV3.GetRegistratioIndexPageAsync(NuGet.Protocol.HttpSource,System.String,System.String,NuGet.Versioning.NuGetVersion,NuGet.Versioning.NuGetVersion,NuGet.Protocol.Core.Types.HttpSourceCacheContext,NuGet.Common.ILogger,System.Threading.CancellationToken)~System.Threading.Tasks.Task{NuGet.Protocol.Model.RegistrationPage}")]
231231
[assembly: SuppressMessage("Globalization", "CA1308:Normalize strings to uppercase", Justification = "We convert packageId to lower case for api call.", Scope = "member", Target = "~M:NuGet.Protocol.PackageMetadataResourceV3.LoadRegistrationIndexAsync(NuGet.Protocol.HttpSource,System.Uri,System.String,NuGet.Protocol.Core.Types.SourceCacheContext,System.Func{NuGet.Protocol.HttpSourceResult,System.Threading.Tasks.Task{NuGet.Protocol.Model.RegistrationIndex}},NuGet.Common.ILogger,System.Threading.CancellationToken)~System.Threading.Tasks.Task{System.ValueTuple{NuGet.Protocol.Model.RegistrationIndex,NuGet.Protocol.Core.Types.HttpSourceCacheContext}}")]
232232
[assembly: SuppressMessage("Usage", "CA2237:Mark ISerializable types with serializable", Justification = "<Pending>", Scope = "type", Target = "~T:NuGet.Protocol.PackageNotFoundProtocolException")]
233+
[assembly: SuppressMessage("Usage", "CA2227:Collection properties should be read only", Justification = "The `Build` method in `src/NuGet.Core/NuGet.Protocol/Model/PackageSearchMetadataBuilder.cs` sets this reference when creating a `ClonedPackageSearchMetadata`.", Scope = "member", Target = "~P:NuGet.Protocol.Core.Types.PackageSearchMetadataBuilder.ClonedPackageSearchMetadata.OwnersList")]

src/NuGet.Core/NuGet.Protocol/Model/IPackageSearchMetadata.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public interface IPackageSearchMetadata
2727
Uri ReportAbuseUrl { get; }
2828
Uri PackageDetailsUrl { get; }
2929
DateTimeOffset? Published { get; }
30+
IReadOnlyList<string> OwnersList { get; }
3031
string Owners { get; }
3132
bool RequireLicenseAcceptance { get; }
3233
string Summary { get; }

src/NuGet.Core/NuGet.Protocol/Model/LocalPackageSearchMetadata.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,21 @@ public LocalPackageSearchMetadata(LocalPackageInfo package)
4242

4343
public Uri LicenseUrl => Convert(_nuspec.GetLicenseUrl());
4444

45+
private IReadOnlyList<string> _ownersList;
46+
47+
public IReadOnlyList<string> OwnersList
48+
{
49+
get
50+
{
51+
if (_ownersList is null)
52+
{
53+
_ownersList = Owners != null ? Owners.Split(',').Where(s => !string.IsNullOrWhiteSpace(s)).Select(s => s.Trim()).ToList() : null;
54+
}
55+
56+
return _ownersList;
57+
}
58+
}
59+
4560
public string Owners => _nuspec.GetOwners();
4661

4762
public Uri ProjectUrl => Convert(_nuspec.GetProjectUrl());

src/NuGet.Core/NuGet.Protocol/Model/PackageSearchMetadata.cs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,35 @@ public PackageIdentity Identity
6262
[JsonConverter(typeof(SafeUriConverter))]
6363
public Uri LicenseUrl { get; private set; }
6464

65+
private IReadOnlyList<string> _ownersList;
66+
6567
[JsonProperty(PropertyName = JsonProperties.Owners)]
66-
[JsonConverter(typeof(MetadataFieldConverter))]
67-
public string Owners { get; private set; }
68+
[JsonConverter(typeof(MetadataStringOrArrayConverter))]
69+
public IReadOnlyList<string> OwnersList
70+
{
71+
get { return _ownersList; }
72+
private set
73+
{
74+
if (_ownersList != value)
75+
{
76+
_ownersList = value;
77+
_owners = null;
78+
}
79+
}
80+
}
81+
82+
private string _owners;
83+
public string Owners
84+
{
85+
get
86+
{
87+
if (_owners == null)
88+
{
89+
_owners = OwnersList != null ? string.Join(", ", OwnersList.Where(s => !string.IsNullOrWhiteSpace(s))) : null;
90+
}
91+
return _owners;
92+
}
93+
}
6894

6995
[JsonProperty(PropertyName = JsonProperties.PackageId)]
7096
public string PackageId { get; private set; }

src/NuGet.Core/NuGet.Protocol/Model/PackageSearchMetadataBuilder.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public class ClonedPackageSearchMetadata : IPackageSearchMetadata
3535
public Uri IconUrl { get; set; }
3636
public PackageIdentity Identity { get; set; }
3737
public Uri LicenseUrl { get; set; }
38+
public IReadOnlyList<string> OwnersList { get; set; }
3839
public string Owners { get; set; }
3940
public Uri ProjectUrl { get; set; }
4041
public DateTimeOffset? Published { get; set; }
@@ -92,6 +93,7 @@ public IPackageSearchMetadata Build()
9293
IconUrl = _metadata.IconUrl,
9394
Identity = _metadata.Identity,
9495
LicenseUrl = _metadata.LicenseUrl,
96+
OwnersList = _metadata.OwnersList,
9597
Owners = _metadata.Owners,
9698
ProjectUrl = _metadata.ProjectUrl,
9799
Published = _metadata.Published,

src/NuGet.Core/NuGet.Protocol/Model/PackageSearchMetadataV2Feed.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
using System;
55
using System.Collections.Generic;
6-
using System.Linq;
76
using System.Threading.Tasks;
87
using NuGet.Packaging;
98
using NuGet.Packaging.Core;
@@ -49,6 +48,7 @@ public PackageSearchMetadataV2Feed(V2FeedPackageInfo package, MetadataReferenceC
4948
Description = package.Description;
5049
IconUrl = GetUriSafe(package.IconUrl);
5150
LicenseUrl = GetUriSafe(package.LicenseUrl);
51+
_ownersList = (IReadOnlyList<string>)package.Owners;
5252
Owners = metadataCache.GetString(string.Join(", ", package.Owners));
5353
PackageId = package.Id;
5454
ProjectUrl = GetUriSafe(package.ProjectUrl);
@@ -85,6 +85,9 @@ public PackageSearchMetadataV2Feed(V2FeedPackageInfo package, MetadataReferenceC
8585

8686
public Uri LicenseUrl { get; private set; }
8787

88+
private IReadOnlyList<string> _ownersList;
89+
public IReadOnlyList<string> OwnersList => _ownersList;
90+
8891
public string Owners { get; private set; }
8992

9093
public string PackageId { get; private set; }
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
11
#nullable enable
2+
~NuGet.Protocol.Core.Types.IPackageSearchMetadata.OwnersList.get -> System.Collections.Generic.IReadOnlyList<string>
3+
~NuGet.Protocol.Core.Types.PackageSearchMetadataBuilder.ClonedPackageSearchMetadata.OwnersList.get -> System.Collections.Generic.IReadOnlyList<string>
4+
~NuGet.Protocol.Core.Types.PackageSearchMetadataBuilder.ClonedPackageSearchMetadata.OwnersList.set -> void
5+
~NuGet.Protocol.LocalPackageSearchMetadata.OwnersList.get -> System.Collections.Generic.IReadOnlyList<string>
6+
~NuGet.Protocol.PackageSearchMetadata.OwnersList.get -> System.Collections.Generic.IReadOnlyList<string>
7+
~NuGet.Protocol.PackageSearchMetadataV2Feed.OwnersList.get -> System.Collections.Generic.IReadOnlyList<string>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
11
#nullable enable
2+
~NuGet.Protocol.Core.Types.IPackageSearchMetadata.OwnersList.get -> System.Collections.Generic.IReadOnlyList<string>
3+
~NuGet.Protocol.Core.Types.PackageSearchMetadataBuilder.ClonedPackageSearchMetadata.OwnersList.get -> System.Collections.Generic.IReadOnlyList<string>
4+
~NuGet.Protocol.Core.Types.PackageSearchMetadataBuilder.ClonedPackageSearchMetadata.OwnersList.set -> void
5+
~NuGet.Protocol.LocalPackageSearchMetadata.OwnersList.get -> System.Collections.Generic.IReadOnlyList<string>
6+
~NuGet.Protocol.PackageSearchMetadata.OwnersList.get -> System.Collections.Generic.IReadOnlyList<string>
7+
~NuGet.Protocol.PackageSearchMetadataV2Feed.OwnersList.get -> System.Collections.Generic.IReadOnlyList<string>

0 commit comments

Comments
 (0)