Skip to content

Commit

Permalink
Add Package Information Fields
Browse files Browse the repository at this point in the history
Extend Nuspec metadata to include:

- Project source url
- Package source url
- Docs url
- Wiki Url
- Mailing List Url
- Bug Tracker Url

Adding the following elements, reserving for future use with respect to
package relationships.
- Replaces
- Provides
- Conflicts
  • Loading branch information
ferventcoder committed Jan 20, 2016
1 parent 27671d2 commit 9b703a8
Show file tree
Hide file tree
Showing 12 changed files with 378 additions and 8 deletions.
9 changes: 9 additions & 0 deletions src/Core/Authoring/Manifest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,15 @@ public static Manifest Create(IPackageMetadata metadata)
Tags = String.IsNullOrEmpty(metadata.Tags) ? null : metadata.Tags.SafeTrim(),
LicenseUrl = ConvertUrlToStringSafe(metadata.LicenseUrl),
ProjectUrl = ConvertUrlToStringSafe(metadata.ProjectUrl),
ProjectSourceUrl = ConvertUrlToStringSafe(metadata.ProjectSourceUrl),
PackageSourceUrl = ConvertUrlToStringSafe(metadata.PackageSourceUrl),
DocsUrl = ConvertUrlToStringSafe(metadata.DocsUrl),
WikiUrl = ConvertUrlToStringSafe(metadata.WikiUrl),
MailingListUrl = ConvertUrlToStringSafe(metadata.MailingListUrl),
BugTrackerUrl = ConvertUrlToStringSafe(metadata.BugTrackerUrl),
Replaces = GetCommaSeparatedString(metadata.Replaces),
Provides = GetCommaSeparatedString(metadata.Provides),
Conflicts = GetCommaSeparatedString(metadata.Conflicts),
IconUrl = ConvertUrlToStringSafe(metadata.IconUrl),
RequireLicenseAcceptance = metadata.RequireLicenseAcceptance,
DevelopmentDependency = metadata.DevelopmentDependency,
Expand Down
188 changes: 183 additions & 5 deletions src/Core/Authoring/ManifestMetadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,43 @@ public string Owners
[XmlElement("tags")]
public string Tags { get; set; }

[SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "Xml deserialziation can't handle uris")]
[XmlElement("projectSourceUrl")]
public string ProjectSourceUrl { get; set; }

[SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "Xml deserialziation can't handle uris")]
[XmlElement("packageSourceUrl")]
public string PackageSourceUrl { get; set; }

[SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "Xml deserialziation can't handle uris")]
[XmlElement("docsUrl")]
public string DocsUrl { get; set; }

[SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "Xml deserialziation can't handle uris")]
[XmlElement("wikiUrl")]
public string WikiUrl { get; set; }

[SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "Xml deserialziation can't handle uris")]
[XmlElement("mailingListUrl")]
public string MailingListUrl { get; set; }

[SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "Xml deserialziation can't handle uris")]
[XmlElement("bugTrackerUrl")]
public string BugTrackerUrl { get; set; }

[XmlElement("replaces")]
public string Replaces { get; set; }

[XmlElement("provides")]
public string Provides { get; set; }

[XmlElement("conflicts")]
public string Conflicts { get; set; }

/// <summary>
/// This property should be used only by the XML serializer. Do not use it in code.
/// </summary>
[SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "value", Justification="The propert setter is not supported.")]
[SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "value", Justification = "The propert setter is not supported.")]
[SuppressMessage("Microsoft.Design", "CA1002:DoNotExposeGenericLists", Justification = "It's easier to create a list")]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly", Justification = "This is needed for xml serialization")]
[XmlArray("dependencies", IsNullable = false)]
Expand Down Expand Up @@ -307,6 +340,114 @@ IEnumerable<string> IPackageMetadata.Owners
}
}

Uri IPackageMetadata.ProjectSourceUrl
{
get
{
if (ProjectSourceUrl == null)
{
return null;
}
return new Uri(ProjectSourceUrl);
}
}

Uri IPackageMetadata.PackageSourceUrl
{
get
{
if (PackageSourceUrl == null)
{
return null;
}
return new Uri(PackageSourceUrl);
}
}

Uri IPackageMetadata.DocsUrl
{
get
{
if (DocsUrl == null)
{
return null;
}
return new Uri(DocsUrl);
}
}

Uri IPackageMetadata.WikiUrl
{
get
{
if (WikiUrl == null)
{
return null;
}
return new Uri(WikiUrl);
}
}

Uri IPackageMetadata.MailingListUrl
{
get
{
if (MailingListUrl == null)
{
return null;
}
return new Uri(MailingListUrl);
}
}

Uri IPackageMetadata.BugTrackerUrl
{
get
{
if (BugTrackerUrl == null)
{
return null;
}
return new Uri(BugTrackerUrl);
}
}

IEnumerable<string> IPackageMetadata.Replaces
{
get
{
if (String.IsNullOrEmpty(Replaces))
{
return Enumerable.Empty<string>();
}
return Replaces.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
}
}

IEnumerable<string> IPackageMetadata.Provides
{
get
{
if (String.IsNullOrEmpty(Provides))
{
return Enumerable.Empty<string>();
}
return Provides.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
}
}

IEnumerable<string> IPackageMetadata.Conflicts
{
get
{
if (String.IsNullOrEmpty(Conflicts))
{
return Enumerable.Empty<string>();
}
return Conflicts.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
}
}

IEnumerable<PackageDependencySet> IPackageMetadata.DependencySets
{
get
Expand All @@ -315,7 +456,7 @@ IEnumerable<PackageDependencySet> IPackageMetadata.DependencySets
{
return Enumerable.Empty<PackageDependencySet>();
}

var dependencySets = DependencySets.Select(CreatePackageDependencySet);

// group the dependency sets with the same target framework together.
Expand Down Expand Up @@ -384,7 +525,7 @@ public IEnumerable<ValidationResult> Validate(ValidationContext validationContex
{
yield return new ValidationResult(String.Format(CultureInfo.CurrentCulture, NuGetResources.Manifest_IdMaxLengthExceeded));
}
else if(!PackageIdValidator.IsValidPackageId(Id))
else if (!PackageIdValidator.IsValidPackageId(Id))
{
yield return new ValidationResult(String.Format(CultureInfo.CurrentCulture, NuGetResources.InvalidPackageId, Id));
}
Expand All @@ -408,6 +549,41 @@ public IEnumerable<ValidationResult> Validate(ValidationContext validationContex
String.Format(CultureInfo.CurrentCulture, NuGetResources.Manifest_UriCannotBeEmpty, "ProjectUrl"));
}

if (ProjectSourceUrl == String.Empty)
{
yield return new ValidationResult(
String.Format(CultureInfo.CurrentCulture, NuGetResources.Manifest_UriCannotBeEmpty, "ProjectSourceUrl"));
}
if (PackageSourceUrl == String.Empty)
{
yield return new ValidationResult(
String.Format(CultureInfo.CurrentCulture, NuGetResources.Manifest_UriCannotBeEmpty, "PackageSourceUrl"));
}

if (DocsUrl == String.Empty)
{
yield return new ValidationResult(
String.Format(CultureInfo.CurrentCulture, NuGetResources.Manifest_UriCannotBeEmpty, "DocsUrl"));
}

if (WikiUrl == String.Empty)
{
yield return new ValidationResult(
String.Format(CultureInfo.CurrentCulture, NuGetResources.Manifest_UriCannotBeEmpty, "WikiUrl"));
}

if (MailingListUrl == String.Empty)
{
yield return new ValidationResult(
String.Format(CultureInfo.CurrentCulture, NuGetResources.Manifest_UriCannotBeEmpty, "MailingListUrl"));
}

if (BugTrackerUrl == String.Empty)
{
yield return new ValidationResult(
String.Format(CultureInfo.CurrentCulture, NuGetResources.Manifest_UriCannotBeEmpty, "BugTrackerUrl"));
}

if (RequireLicenseAcceptance && String.IsNullOrWhiteSpace(LicenseUrl))
{
yield return new ValidationResult(NuGetResources.Manifest_RequireLicenseAcceptanceRequiresLicenseUrl);
Expand All @@ -425,10 +601,10 @@ private static IEnumerable<FrameworkName> ParseFrameworkNames(string frameworkNa
.Select(VersionUtility.ParseFrameworkName);
}

private static PackageDependencySet CreatePackageDependencySet(ManifestDependencySet manifestDependencySet)
private static PackageDependencySet CreatePackageDependencySet(ManifestDependencySet manifestDependencySet)
{
FrameworkName targetFramework = manifestDependencySet.TargetFramework == null
? null
? null
: VersionUtility.ParseFrameworkName(manifestDependencySet.TargetFramework);

var dependencies = from d in manifestDependencySet.Dependencies
Expand All @@ -440,5 +616,7 @@ private static PackageDependencySet CreatePackageDependencySet(ManifestDependenc

return new PackageDependencySet(targetFramework, dependencies);
}


}
}
27 changes: 27 additions & 0 deletions src/Core/Authoring/ManifestReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,33 @@ private static void ReadMetadataValue(ManifestMetadata manifestMetadata, XElemen
case "tags":
manifestMetadata.Tags = value;
break;
case "projectSourceUrl":
manifestMetadata.ProjectSourceUrl = value;
break;
case "packageSourceUrl":
manifestMetadata.PackageSourceUrl = value;
break;
case "docsUrl":
manifestMetadata.DocsUrl = value;
break;
case "wikiUrl":
manifestMetadata.WikiUrl = value;
break;
case "mailingListUrl":
manifestMetadata.MailingListUrl = value;
break;
case "bugTrackerUrl":
manifestMetadata.BugTrackerUrl = value;
break;
case "replaces":
manifestMetadata.Replaces = value;
break;
case "provides":
manifestMetadata.Provides = value;
break;
case "conflicts":
manifestMetadata.Conflicts = value;
break;
case "dependencies":
manifestMetadata.DependencySets = ReadDependencySets(element);
break;
Expand Down
10 changes: 8 additions & 2 deletions src/Core/Authoring/ManifestSchemaUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,21 @@ internal static class ManifestSchemaUtility
/// <summary>
/// Allows XDT transformation
/// </summary>
internal const string SchemaVersionV6 = "http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd";
internal const string SchemaVersionV6 = "http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd";

/// <summary>
/// Allows Choco Schemas
/// </summary>
internal const string SchemaVersionV7 = "http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd";

private static readonly string[] VersionToSchemaMappings = new[] {
SchemaVersionV1,
SchemaVersionV2,
SchemaVersionV3,
SchemaVersionV4,
SchemaVersionV5,
SchemaVersionV6
SchemaVersionV6,
SchemaVersionV7
};

private static ConcurrentDictionary<string, XmlSchemaSet> _manifestSchemaSetCache = new ConcurrentDictionary<string, XmlSchemaSet>(StringComparer.OrdinalIgnoreCase);
Expand Down
47 changes: 47 additions & 0 deletions src/Core/Authoring/PackageBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ private PackageBuilder(bool includeEmptyDirectories)
PackageAssemblyReferences = new Collection<PackageReferenceSet>();
Authors = new HashSet<string>();
Owners = new HashSet<string>();
Replaces = new HashSet<string>();
Provides = new HashSet<string>();
Conflicts = new HashSet<string>();
Tags = new HashSet<string>();
}

Expand Down Expand Up @@ -149,6 +152,16 @@ public ISet<string> Tags
private set;
}

public Uri ProjectSourceUrl { get; set; }
public Uri PackageSourceUrl { get; set; }
public Uri DocsUrl { get; set; }
public Uri WikiUrl { get; set; }
public Uri MailingListUrl { get; set; }
public Uri BugTrackerUrl { get; set; }
public ISet<string> Replaces { get; set; }
public ISet<string> Provides { get; set; }
public ISet<string> Conflicts { get; set; }

public string Copyright
{
get;
Expand Down Expand Up @@ -212,6 +225,30 @@ string IPackageMetadata.Tags
}
}

IEnumerable<string> IPackageMetadata.Replaces
{
get
{
return Replaces;
}
}

IEnumerable<string> IPackageMetadata.Provides
{
get
{
return Provides;
}
}

IEnumerable<string> IPackageMetadata.Conflicts
{
get
{
return Conflicts;
}
}

IEnumerable<PackageDependencySet> IPackageMetadata.DependencySets
{
get
Expand Down Expand Up @@ -445,6 +482,16 @@ public void Populate(ManifestMetadata manifestMetadata)
MinClientVersion = metadata.MinClientVersion;
ContentFiles = new Collection<ManifestContentFiles>(manifestMetadata.ContentFiles);

ProjectSourceUrl = metadata.ProjectSourceUrl;
PackageSourceUrl = metadata.PackageSourceUrl;
DocsUrl = metadata.DocsUrl;
WikiUrl = metadata.WikiUrl;
MailingListUrl = metadata.MailingListUrl;
BugTrackerUrl = metadata.BugTrackerUrl;
Replaces.AddRange(metadata.Replaces);
Provides.AddRange(metadata.Provides);
Conflicts.AddRange(metadata.Conflicts);

if (metadata.Tags != null)
{
Tags.AddRange(ParseTags(metadata.Tags));
Expand Down
Loading

0 comments on commit 9b703a8

Please sign in to comment.