Skip to content

Commit

Permalink
Parse FrameworkRestrictions from LockFile - references #307
Browse files Browse the repository at this point in the history
  • Loading branch information
forki committed Nov 19, 2014
1 parent 0c76538 commit 0f16c4b
Show file tree
Hide file tree
Showing 12 changed files with 65 additions and 14 deletions.
3 changes: 3 additions & 0 deletions src/Paket.Core/DependenciesFile.fs
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@ module DependenciesFileParser =
Name = PackageName name
ResolverStrategy = parseResolverStrategy version
Parent = DependenciesFile fileName
FrameworkRestriction = None
VersionRequirement = parseVersionRequirement(version.Trim '!') } :: packages, sourceFiles
| SourceFile(origin, (owner,project, commit), path) ->
lineNo, options, sources, packages, { Owner = owner; Project = project; Commit = commit; Name = path; Origin = origin} :: sourceFiles
Expand Down Expand Up @@ -268,6 +269,7 @@ type DependenciesFile(fileName,options,packages : PackageRequirement list, remot
VersionRequirement = versionRange
Sources = sources
ResolverStrategy = DependenciesFileParser.parseResolverStrategy version
FrameworkRestriction = None
Parent = PackageRequirementSource.DependenciesFile fileName }

DependenciesFile(fileName,options,packages @ [newPackage], remoteFiles)
Expand All @@ -289,6 +291,7 @@ type DependenciesFile(fileName,options,packages : PackageRequirement list, remot
VersionRequirement = versionRange
Sources = sources
ResolverStrategy = strategy
FrameworkRestriction = None
Parent = PackageRequirementSource.DependenciesFile fileName }

DependenciesFile(fileName,options,(packages |> List.filter (fun p -> NormalizedPackageName p.Name <> NormalizedPackageName packageName)) @ [newPackage], remoteFiles)
Expand Down
12 changes: 8 additions & 4 deletions src/Paket.Core/LockFile.fs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ module LockFileSerializer =
yield " specs:"
for _,_,package in packages |> Seq.sortBy (fun (_,_,p) -> NormalizedPackageName p.Name) do
let (PackageName packageName) = package.Name
yield sprintf " %s (%s)" (packageName) (package.Version.ToString())
match package.FrameworkRestriction with
| None -> yield sprintf " %s (%s)" packageName (package.Version.ToString())
| Some restriction -> yield sprintf " %s (%s) - %s" packageName (package.Version.ToString()) (restriction.ToString())
for (PackageName name),v,restriction in package.Dependencies do
match restriction with
| None -> yield sprintf " %s (%s)" name (v.ToString())
Expand Down Expand Up @@ -133,14 +135,16 @@ module LockFileParser =
| NugetPackage details ->
match state.RemoteUrl with
| Some remote ->
let parts = details.Split ' '
let version = parts.[1] |> removeBrackets
let parts = details.Split([|" - "|],StringSplitOptions.None)
let parts' = parts.[0].Split ' '
let version = parts'.[1] |> removeBrackets
{ state with LastWasPackage = true
Packages =
{ Source = PackageSource.Parse(remote, None)
Name = PackageName parts.[0]
Name = PackageName parts'.[0]
Dependencies = Set.empty
Unlisted = false
FrameworkRestriction = if parts.Length < 2 then None else FrameworkIdentifier.Extract(parts.[1].Trim())
Version = SemVer.Parse version } :: state.Packages }
| None -> failwith "no source has been specified."
| NugetDependency (name, _) ->
Expand Down
1 change: 1 addition & 0 deletions src/Paket.Core/NugetConvert.fs
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ let private convertNugetsToDepFile(dependenciesFilename,nugetPackagesConfigs, so
Requirements.PackageRequirement.VersionRequirement = VersionRequirement(VersionRange.Specific(SemVer.Parse v), PreReleaseStatus.No)
Requirements.PackageRequirement.ResolverStrategy = Max
Requirements.PackageRequirement.Sources = sources
Requirements.PackageRequirement.FrameworkRestriction = None
Requirements.PackageRequirement.Parent = Requirements.PackageRequirementSource.DependenciesFile dependenciesFilename}

match existingDepFile with
Expand Down
14 changes: 8 additions & 6 deletions src/Paket.Core/PackageResolver.fs
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,15 @@ type PackageDetails =
Source : PackageSource
DownloadLink : string
Unlisted : bool
DirectDependencies : (PackageName * VersionRequirement * (FrameworkIdentifier option)) Set }
DirectDependencies : (PackageName * VersionRequirement * FrameworkRestriction) Set }

/// Represents data about resolved packages
type ResolvedPackage =
{ Name : PackageName
Version : SemVerInfo
Dependencies : (PackageName * VersionRequirement * (FrameworkIdentifier option)) Set
Unlisted : bool
Dependencies : (PackageName * VersionRequirement * FrameworkRestriction) Set
Unlisted : bool
FrameworkRestriction: FrameworkRestriction
Source : PackageSource }

override this.ToString() =
Expand Down Expand Up @@ -81,7 +82,7 @@ let Resolve(getVersionsF, getPackageDetailsF, rootDependencies:PackageRequiremen
let exploredPackages = Dictionary<NormalizedPackageName*SemVerInfo,ResolvedPackage>()
let allVersions = new Dictionary<NormalizedPackageName,SemVerInfo list>()

let getExploredPackage(sources,packageName:PackageName,version) =
let getExploredPackage(sources,packageName:PackageName,version,frameworkRequirement) =
let normalizedPackageName = NormalizedPackageName packageName
match exploredPackages.TryGetValue <| (normalizedPackageName,version) with
| true,package -> package
Expand All @@ -94,6 +95,7 @@ let Resolve(getVersionsF, getPackageDetailsF, rootDependencies:PackageRequiremen
Version = version
Dependencies = packageDetails.DirectDependencies
Unlisted = packageDetails.Unlisted
FrameworkRestriction = frameworkRequirement
Source = packageDetails.Source }
exploredPackages.Add((normalizedPackageName,version),explored)
explored
Expand Down Expand Up @@ -177,12 +179,12 @@ let Resolve(getVersionsF, getPackageDetailsF, rootDependencies:PackageRequiremen
|> List.fold (fun (allUnlisted,state) versionToExplore ->
match state with
| ResolvedPackages.Conflict _ ->
let exploredPackage = getExploredPackage(dependency.Sources,dependency.Name,versionToExplore)
let exploredPackage = getExploredPackage(dependency.Sources,dependency.Name,versionToExplore,dependency.FrameworkRestriction)
if exploredPackage.Unlisted && not useUnlisted then (allUnlisted,state) else
let newFilteredVersion = Map.add dependency.Name ([versionToExplore],globalOverride) filteredVersions
let newDependencies =
exploredPackage.Dependencies
|> Set.map (fun (n,v,_) -> {dependency with Name = n; VersionRequirement = v; Parent = Package(dependency.Name,versionToExplore) })
|> Set.map (fun (n,v,r) -> {dependency with Name = n; VersionRequirement = v; Parent = Package(dependency.Name,versionToExplore); FrameworkRestriction = r })
|> Set.filter (fun d -> Set.contains d closed |> not)
|> Set.filter (fun d -> Set.contains d stillOpen |> not)
|> Set.filter (fun d ->
Expand Down
2 changes: 1 addition & 1 deletion src/Paket.Core/Paket.Core.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -455,10 +455,10 @@
<Compile Include="Utils.fs" />
<Compile Include="ConfigFile.fs" />
<Compile Include="PackageSources.fs" />
<Compile Include="FrameworkHandling.fs" />
<Compile Include="Requirements.fs" />
<Compile Include="ModuleResolver.fs" />
<Compile Include="RemoteDownload.fs" />
<Compile Include="FrameworkHandling.fs" />
<Compile Include="PackageResolver.fs" />
<Compile Include="Nuspec.fs" />
<Compile Include="InstallModel.fs" />
Expand Down
3 changes: 3 additions & 0 deletions src/Paket.Core/Requirements.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ open Paket
open Paket.Domain
open Paket.PackageSources

type FrameworkRestriction = FrameworkIdentifier option

type PackageRequirementSource =
| DependenciesFile of string
| Package of PackageName * SemVerInfo
Expand All @@ -15,6 +17,7 @@ type PackageRequirement =
VersionRequirement : VersionRequirement
ResolverStrategy : ResolverStrategy
Parent: PackageRequirementSource
FrameworkRestriction: FrameworkRestriction
Sources : PackageSource list }

override this.Equals(that) =
Expand Down
4 changes: 2 additions & 2 deletions src/Paket/Paket.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@
<WarningLevel>3</WarningLevel>
<DocumentationFile>
</DocumentationFile>
<StartArguments>update</StartArguments>
<StartArguments>update -f</StartArguments>
<StartAction>Project</StartAction>
<StartProgram>paket.exe</StartProgram>
<StartWorkingDirectory>
</StartWorkingDirectory>
<StartWorkingDirectory>D:\code\PaketKopie</StartWorkingDirectory>
<StartWorkingDirectory>D:\code\Paket09x</StartWorkingDirectory>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ let require packageName strategy text : PackageRequirement =
VersionRequirement = parse text
ResolverStrategy = strategy
Parent = PackageRequirementSource.DependenciesFile ""
FrameworkRestriction = None
Sources = [] }

[<Test>]
Expand Down
36 changes: 35 additions & 1 deletion tests/Paket.Tests/Lockfile/ParserSpecs.fs
Original file line number Diff line number Diff line change
Expand Up @@ -141,5 +141,39 @@ let ``should parse own lock file``() =
packages.[1].Source |> shouldEqual PackageSources.DefaultNugetSource
packages.[1].Name |> shouldEqual (PackageName "FAKE")
packages.[1].Version |> shouldEqual (SemVer.Parse "3.5.5")
packages.[3].FrameworkRestriction |> shouldEqual None

lockFile.SourceFiles.[0].Name |> shouldEqual "modules/Octokit/Octokit.fsx"
lockFile.SourceFiles.[0].Name |> shouldEqual "modules/Octokit/Octokit.fsx"


let frameworkRestricted = """NUGET
remote: https://nuget.org/api/v2
specs:
Fleece (0.4.0)
FSharpPlus (>= 0.0.4)
ReadOnlyCollectionExtensions (>= 1.2.0)
ReadOnlyCollectionInterfaces (1.0.0)
System.Json (>= 4.0.20126.16343)
FsControl (1.0.9)
FSharpPlus (0.0.4)
FsControl (>= 1.0.9)
LinqBridge (1.3.0) - net20
ReadOnlyCollectionExtensions (1.2.0)
LinqBridge (>= 1.3.0) - net20
ReadOnlyCollectionInterfaces (1.0.0) - net20
ReadOnlyCollectionInterfaces (1.0.0) - net35
ReadOnlyCollectionInterfaces (1.0.0) - net40
ReadOnlyCollectionInterfaces (1.0.0)
System.Json (4.0.20126.16343)
"""

[<Test>]
let ``should parse framework restricted lock file``() =
let lockFile = LockFileParser.Parse(toLines frameworkRestricted)
let packages = List.rev lockFile.Packages
packages.Length |> shouldEqual 7

packages.[3].Source |> shouldEqual PackageSources.DefaultNugetSource
packages.[3].Name |> shouldEqual (PackageName "LinqBridge")
packages.[3].Version |> shouldEqual (SemVer.Parse "1.3.0")
packages.[3].FrameworkRestriction |> shouldEqual (Some (FrameworkIdentifier.DotNetFramework(FrameworkVersion.V2)))
1 change: 1 addition & 0 deletions tests/Paket.Tests/Resolver/ConflictGraphSpecs.fs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ let defaultPackage =
Parent = PackageRequirementSource.DependenciesFile ""
VersionRequirement = VersionRequirement(VersionRange.Exactly "1.0", PreReleaseStatus.No)
Sources = [ PackageSource.NugetSource "" ]
FrameworkRestriction = None
ResolverStrategy = ResolverStrategy.Max }

[<Test>]
Expand Down
1 change: 1 addition & 0 deletions tests/Paket.Tests/Simplifier/BasicScenarioSpecs.fs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ let toPackages =
Version = SemVer.Parse ver
Source = PackageSources.DefaultNugetSource
Unlisted = false
FrameworkRestriction = None
Dependencies = deps |> List.map (fun (name, verRan) -> PackageName name, NugetVersionRangeParser.parse verRan,None) |> Set.ofList } : PackageResolver.ResolvedPackage)

let graph1 =
Expand Down
1 change: 1 addition & 0 deletions tests/Paket.Tests/TestHelpers.fs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ let safeResolve graph (dependencies : (string * VersionRange) list) =
VersionRequirement = VersionRequirement(v,PreReleaseStatus.No)
Sources = [ PackageSource.NugetSource "" ]
Parent = PackageRequirementSource.DependenciesFile ""
FrameworkRestriction = None
ResolverStrategy = ResolverStrategy.Max })
PackageResolver.Resolve(VersionsFromGraph graph, PackageDetailsFromGraph graph, packages)

Expand Down

0 comments on commit 0f16c4b

Please sign in to comment.