Permalink
Browse files

data and feed changes to support new dependency sets

  • Loading branch information...
1 parent 6c3d481 commit f21797ade6dfacfb1329f6756465e0aed1463b4a @half-ogre half-ogre committed Jun 13, 2012
View
@@ -56,8 +56,9 @@
<Reference Include="MvcHaack.Ajax, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MvcHaack.Ajax.1.1\lib\net40\MvcHaack.Ajax.dll</HintPath>
</Reference>
- <Reference Include="NuGet.Core">
- <HintPath>..\packages\NuGet.Core.1.6.1\lib\net40-Client\NuGet.Core.dll</HintPath>
+ <Reference Include="NuGet.Core, Version=2.0.30612.360, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\Nuget.Core.2.0.0-alpha001\lib\net40-Client\NuGet.Core.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" />
@@ -94,7 +94,7 @@ public void WillReadThePropertiesFromTheNuGetPackageWhenCreatingANewPackage()
Assert.False(package.IsPrerelease);
Assert.Equal("theFirstAuthor, theSecondAuthor", package.FlattenedAuthors);
- Assert.Equal("theFirstDependency:[1.0, 2.0)|theSecondDependency:[1.0]|theThirdDependency:", package.FlattenedDependencies);
+ Assert.Equal("theFirstDependency:[1.0, 2.0):net4000|theSecondDependency:[1.0]:net4000|theThirdDependency::net4000|theFourthDependency:[1.0]:net35", package.FlattenedDependencies);
}
[Fact]
@@ -119,25 +119,7 @@ public void WillReadPrereleaseFlagFromNuGetPackage()
currentUser);
// Assert
- Assert.Equal("2.14.0-a", package.Version);
- Assert.Equal("theFirstAuthor", package.Authors.ElementAt(0).Name);
- Assert.Equal("theSecondAuthor", package.Authors.ElementAt(1).Name);
- Assert.Equal("theFirstDependency", package.Dependencies.ElementAt(0).Id);
- Assert.Equal("[1.0, 2.0)", package.Dependencies.ElementAt(0).VersionSpec);
- Assert.Equal("theSecondDependency", package.Dependencies.ElementAt(1).Id);
- Assert.Equal("[1.0]", package.Dependencies.ElementAt(1).VersionSpec);
- Assert.Equal("theDescription", package.Description);
- Assert.Equal("http://theiconurl/", package.IconUrl);
- Assert.Equal("http://thelicenseurl/", package.LicenseUrl);
- Assert.Equal("http://theprojecturl/", package.ProjectUrl);
- Assert.Equal(true, package.RequiresLicenseAcceptance);
- Assert.Equal("theSummary", package.Summary);
- Assert.Equal("theTags", package.Tags);
- Assert.Equal("theTitle", package.Title);
Assert.True(package.IsPrerelease);
-
- Assert.Equal("theFirstAuthor, theSecondAuthor", package.FlattenedAuthors);
- Assert.Equal("theFirstDependency:[1.0, 2.0)|theSecondDependency:[1.0]|theThirdDependency:", package.FlattenedDependencies);
packageRegistrationRepo.Verify();
}
@@ -325,22 +307,26 @@ void WillThrowIfTheNuGetPackageCopyrightIsLongerThan4000()
}
[Fact]
- void WillThrowIfTheNuGetPackageDependenciesIsLongerThan4000()
+ void WillThrowIfTheNuGetPackageDependenciesIsLongerThanInt16MaxValue()
{
var service = CreateService();
var nugetPackage = CreateNuGetPackage();
- nugetPackage.Setup(x => x.Dependencies).Returns(new[] {
- new NuGet.PackageDependency("theFirstDependency".PadRight(2000, '_'), new VersionSpec {
+ nugetPackage.Setup(x => x.DependencySets).Returns(new[]
+ {
+ new PackageDependencySet(VersionUtility.DefaultTargetFramework, new[]
+ {
+ new NuGet.PackageDependency("theFirstDependency".PadRight(Int16.MaxValue, '_'), new VersionSpec {
MinVersion = new SemanticVersion("1.0"),
MaxVersion = new SemanticVersion("2.0"),
IsMinInclusive = true,
IsMaxInclusive = false }),
- new NuGet.PackageDependency("theSecondDependency".PadRight(2000, '_'), new VersionSpec(new SemanticVersion("1.0"))),
+ new NuGet.PackageDependency("theSecondDependency".PadRight(Int16.MaxValue, '_'), new VersionSpec(new SemanticVersion("1.0"))),
+ })
});
var ex = Assert.Throws<EntityException>(() => service.CreatePackage(nugetPackage.Object, null));
- Assert.Equal(String.Format(Strings.NuGetPackagePropertyTooLong, "Dependencies", "4000"), ex.Message);
+ Assert.Equal(String.Format(Strings.NuGetPackagePropertyTooLong, "Dependencies", Int16.MaxValue), ex.Message);
}
[Fact]
@@ -1208,16 +1194,23 @@ static Mock<IPackage> CreateNuGetPackage(Action<Mock<IPackage>> setup = null)
nugetPackage.Setup(x => x.Version).Returns(new SemanticVersion("1.0.42.0"));
nugetPackage.Setup(x => x.Authors).Returns(new[] { "theFirstAuthor", "theSecondAuthor" });
- nugetPackage.Setup(x => x.Dependencies).Returns(new[]
+ nugetPackage.Setup(x => x.DependencySets).Returns(new []
{
- new NuGet.PackageDependency("theFirstDependency", new VersionSpec {
- MinVersion = new SemanticVersion("1.0"),
- MaxVersion = new SemanticVersion("2.0"),
- IsMinInclusive = true,
- IsMaxInclusive = false
+ new PackageDependencySet(VersionUtility.DefaultTargetFramework, new[]
+ {
+ new NuGet.PackageDependency("theFirstDependency", new VersionSpec {
+ MinVersion = new SemanticVersion("1.0"),
+ MaxVersion = new SemanticVersion("2.0"),
+ IsMinInclusive = true,
+ IsMaxInclusive = false
+ }),
+ new NuGet.PackageDependency("theSecondDependency", new VersionSpec(new SemanticVersion("1.0"))),
+ new NuGet.PackageDependency("theThirdDependency")
}),
- new NuGet.PackageDependency("theSecondDependency", new VersionSpec(new SemanticVersion("1.0"))),
- new NuGet.PackageDependency("theThirdDependency")
+ new PackageDependencySet(VersionUtility.ParseFrameworkName("net35"), new[]
+ {
+ new NuGet.PackageDependency("theFourthDependency", new VersionSpec(new SemanticVersion("1.0"))),
+ })
});
nugetPackage.Setup(x => x.Description).Returns("theDescription");
nugetPackage.Setup(x => x.ReleaseNotes).Returns("theReleaseNotes");
@@ -9,7 +9,7 @@
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" />
<package id="Moq" version="4.0.10827" />
<package id="MvcHaack.Ajax" version="1.1" />
- <package id="Nuget.Core" version="1.6.1" />
+ <package id="Nuget.Core" version="2.0.0-alpha001" />
<package id="WebActivator" version="1.5" />
<package id="WebBackgrounder" version="0.1" />
<package id="WebBackgrounder.EntityFramework" version="0.1" />
@@ -10,5 +10,6 @@ public class PackageDependency : IEntity
public string Id { get; set; }
public string VersionSpec { get; set; }
+ public string TargetFramework { get; set; }
}
}
@@ -10,6 +10,7 @@
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.WebPages;
+using NuGet;
namespace NuGetGallery
{
@@ -49,19 +50,19 @@ public static string Flatten(this ICollection<PackageAuthor> authors)
return authors.Select(a => a.Name).Flatten();
}
- public static string Flatten(this ICollection<PackageDependency> dependencies)
+ public static string Flatten(this IEnumerable<PackageDependencySet> dependencySets)
{
- return FlattenDependencies(dependencies.Select(d => new Tuple<string, string>(d.Id, d.VersionSpec.ToStringSafe())));
+ return FlattenDependencies(dependencySets.SelectMany(ds => ds.Dependencies.Select(d => new { d.Id, VersionSpec = d.VersionSpec.ToStringSafe(), TargetFramework = ds.TargetFramework == null ? null : VersionUtility.GetShortFrameworkName(ds.TargetFramework) })));
}
-
- public static string Flatten(this IEnumerable<NuGet.PackageDependency> dependencies)
+
+ public static string Flatten(this ICollection<PackageDependency> dependencies)
{
- return FlattenDependencies(dependencies.Select(d => new Tuple<string, string>(d.Id, d.VersionSpec.ToStringSafe())));
+ return FlattenDependencies(dependencies.Select(d => new { d.Id, VersionSpec = d.VersionSpec.ToStringSafe(), TargetFramework = d.TargetFramework.ToStringSafe() }));
}
- static string FlattenDependencies(IEnumerable<Tuple<string, string>> dependencies)
+ static string FlattenDependencies(IEnumerable<dynamic> dependencies)
{
- return String.Join("|", dependencies.Select(d => String.Format(CultureInfo.InvariantCulture, "{0}:{1}", d.Item1, d.Item2)).ToArray());
+ return String.Join("|", dependencies.Select(d => String.Format(CultureInfo.InvariantCulture, "{0}:{1}:{2}", d.Id, d.VersionSpec, d.TargetFramework)));
}
public static HelperResult Flatten<T>(this IEnumerable<T> items, Func<T, HelperResult> template)
@@ -0,0 +1,24 @@
+// <auto-generated />
+namespace NuGetGallery.Migrations
+{
+ using System.Data.Entity.Migrations;
+ using System.Data.Entity.Migrations.Infrastructure;
+
+ public sealed partial class AddTargetFxToDependencies : IMigrationMetadata
+ {
+ string IMigrationMetadata.Id
+ {
+ get { return "201206131919241_AddTargetFxToDependencies"; }
+ }
+
+ string IMigrationMetadata.Source
+ {
+ get { return null; }
+ }
+
+ string IMigrationMetadata.Target
+ {
+ get { return "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"; }
+ }
+ }
+}
Oops, something went wrong.

0 comments on commit f21797a

Please sign in to comment.