diff --git a/src/Paket.Core/InstallModel.fs b/src/Paket.Core/InstallModel.fs index 693d2a616b..f200698ed5 100644 --- a/src/Paket.Core/InstallModel.fs +++ b/src/Paket.Core/InstallModel.fs @@ -288,25 +288,7 @@ type InstallModel = | [] -> this | restrictions -> let applRestriction folder = - { folder with - Targets = - folder.Targets - |> List.filter - (function - | SinglePlatform pf -> - restrictions - |> List.exists (fun restriction -> - match restriction with - | FrameworkRestriction.Exactly fw -> pf = fw - | FrameworkRestriction.Portable r -> false - | FrameworkRestriction.AtLeast fw -> pf >= fw - | FrameworkRestriction.Between(min,max) -> pf >= min && pf < max) - | _ -> - restrictions - |> List.exists (fun restriction -> - match restriction with - | FrameworkRestriction.Portable r -> true - | _ -> false))} + { folder with Targets = applyRestrictionsToTargets restrictions folder.Targets} {this with ReferenceFileFolders = @@ -317,7 +299,7 @@ type InstallModel = TargetsFileFolders = this.TargetsFileFolders |> List.map applRestriction - |> List.filter (fun folder -> folder.Targets <> []) } + |> List.filter (fun folder -> folder.Targets <> []) } member this.GetFrameworkAssembliesLazy = lazy ([ for lib in this.ReferenceFileFolders do diff --git a/src/Paket.Core/Requirements.fs b/src/Paket.Core/Requirements.fs index fb1e5d3574..5b7e12e28b 100644 --- a/src/Paket.Core/Requirements.fs +++ b/src/Paket.Core/Requirements.fs @@ -213,6 +213,44 @@ let filterRestrictions (list1:FrameworkRestrictions) (list2:FrameworkRestriction if c <> [] then yield! c] |> optimizeRestrictions +let inline frameworkCategory (fw:FrameworkIdentifier) = + match fw with + | DotNetFramework _ -> ".NET" + | Silverlight _ -> "Silverlight" + | DNX _ -> "DNX" + | DNXCore _ -> "DNXCore" + | MonoAndroid _ -> "MonoAndroid" + | MonoMac _ -> "MonoMac" + | MonoTouch _ -> "MonoTouch" + | Windows _ -> "Windows" + | WindowsPhoneApp _ -> "WindowsPhoneApp" + | WindowsPhoneSilverlight _ -> "WindowsPhoneSilverlight" + | XamarinMac _ -> "XamarinMac" + | XamariniOS _ -> "XamariniOS" + + +/// Get if a target should be considered with the specified restrictions +let isTargetMatchingRestrictions (restrictions:FrameworkRestrictions) = function + | SinglePlatform pf -> + restrictions + |> List.exists (fun restriction -> + match restriction with + | FrameworkRestriction.Exactly fw -> pf = fw + | FrameworkRestriction.Portable _ -> false + | FrameworkRestriction.AtLeast fw -> pf >= fw && frameworkCategory pf = frameworkCategory fw + | FrameworkRestriction.Between(min,max) -> pf >= min && pf < max && frameworkCategory pf = frameworkCategory min) + | PortableProfile(_,_) -> + restrictions + |> List.exists (fun restriction -> + match restriction with + | FrameworkRestriction.Portable _ -> true + | _ -> false) + +/// Get all targets that should be considered with the specified restrictions +let applyRestrictionsToTargets (restrictions:FrameworkRestrictions) (targets: TargetProfile list) = + let result = targets |> List.filter (isTargetMatchingRestrictions restrictions) + result + type ContentCopySettings = | Omit | Overwrite diff --git a/tests/Paket.Tests/Paket.Tests.fsproj b/tests/Paket.Tests/Paket.Tests.fsproj index a9721aafc3..733c157d23 100644 --- a/tests/Paket.Tests/Paket.Tests.fsproj +++ b/tests/Paket.Tests/Paket.Tests.fsproj @@ -1,4 +1,4 @@ - + @@ -308,6 +308,7 @@ + diff --git a/tests/Paket.Tests/Requirements/RestrictionApplicationSpecs.fs b/tests/Paket.Tests/Requirements/RestrictionApplicationSpecs.fs new file mode 100644 index 0000000000..04237c032d --- /dev/null +++ b/tests/Paket.Tests/Requirements/RestrictionApplicationSpecs.fs @@ -0,0 +1,83 @@ +module Paket.Requirements.RestrictionApplicationSpecs + +open Paket +open FsUnit +open NUnit.Framework +open Paket.Requirements + +let dotnet x = SinglePlatform(DotNetFramework(x)) + +module TestTargetProfiles = + let DotNetFrameworkVersions = + [FrameworkVersion.V1 + FrameworkVersion.V1_1 + FrameworkVersion.V2 + FrameworkVersion.V3 + FrameworkVersion.V3_5 + FrameworkVersion.V4_Client + FrameworkVersion.V4 + FrameworkVersion.V4_5 + FrameworkVersion.V4_5_1 + FrameworkVersion.V4_5_2 + FrameworkVersion.V4_5_3 + FrameworkVersion.V4_6] + + let DotNetFrameworkProfiles = DotNetFrameworkVersions |> List.map dotnet + + let WindowsProfiles = + [SinglePlatform(Windows "v4.5") + SinglePlatform(Windows "v4.5.1")] + + let SilverlightProfiles = + [SinglePlatform(Silverlight "v3.0") + SinglePlatform(Silverlight "v4.0") + SinglePlatform(Silverlight "v5.0")] + + let WindowsPhoneSilverlightProfiles = + [SinglePlatform(WindowsPhoneSilverlight "v7.0") + SinglePlatform(WindowsPhoneSilverlight "v7.1") + SinglePlatform(WindowsPhoneSilverlight "v8.0") + SinglePlatform(WindowsPhoneSilverlight "v8.1")] + + let AllProfiles = + DotNetFrameworkProfiles @ + WindowsProfiles @ + SilverlightProfiles @ + WindowsPhoneSilverlightProfiles @ + [SinglePlatform(MonoAndroid) + SinglePlatform(MonoTouch) + SinglePlatform(XamariniOS) + SinglePlatform(XamarinMac) + SinglePlatform(WindowsPhoneApp "v8.1") + ] + +[] +let ``>= net10 contains all but only dotnet versions (#1124)`` () = + /// https://github.com/fsprojects/Paket/issues/1124 + let restrictions = [FrameworkRestriction.AtLeast(DotNetFramework(FrameworkVersion.V1))] + let restricted = applyRestrictionsToTargets restrictions TestTargetProfiles.AllProfiles + + restricted |> shouldEqual TestTargetProfiles.DotNetFrameworkProfiles + +[] +let ``>= net452 contains 4.5.2 and following versions`` () = + let restrictions = [FrameworkRestriction.AtLeast(DotNetFramework(FrameworkVersion.V4_5_2))] + let restricted = applyRestrictionsToTargets restrictions TestTargetProfiles.AllProfiles + let expected = [FrameworkVersion.V4_5_2; FrameworkVersion.V4_5_3; FrameworkVersion.V4_6] |> List.map dotnet + + restricted |> shouldEqual expected + +[] +let ``>= net40 < net451 contains 4.0 and 4.5`` () = + let restrictions = [FrameworkRestriction.Between(DotNetFramework(FrameworkVersion.V4), DotNetFramework(FrameworkVersion.V4_5_1))] + let restricted = applyRestrictionsToTargets restrictions TestTargetProfiles.AllProfiles + let expected = [FrameworkVersion.V4; FrameworkVersion.V4_5] |> List.map dotnet + + restricted |> shouldEqual expected + +[] +let ``>= sl30 contains all but only silverlight versions`` () = + let restrictions = [FrameworkRestriction.AtLeast(Silverlight "v3.0")] + let restricted = applyRestrictionsToTargets restrictions TestTargetProfiles.AllProfiles + + restricted |> shouldEqual TestTargetProfiles.SilverlightProfiles \ No newline at end of file