Skip to content

Commit

Permalink
Add typealias for CompatibilityInfo.Requirements
Browse files Browse the repository at this point in the history
  • Loading branch information
jasonboyle committed Aug 9, 2018
1 parent c763fde commit c557718
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 14 deletions.
6 changes: 4 additions & 2 deletions Source/CarthageKit/CompatibilityInfo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import Result

/// Identifies a dependency, its pinned version, and its compatible and incompatible requirements
public struct CompatibilityInfo {
public typealias Requirements = [Dependency: [Dependency: VersionSpecifier]]

/// The dependency
public let dependency: Dependency

Expand Down Expand Up @@ -31,8 +33,8 @@ public struct CompatibilityInfo {
/// Accepts a dictionary which maps a dependency to the pinned versions of the dependencies it requires.
/// Returns an inverted dictionary which maps a dependency to the dependencies that require it and the pinned version required.
/// e.g. [A: [B: 1, C: 2]] -> [B: [A: 1], C: [A: 2]]
public static func invert(requirements: [Dependency: [Dependency: VersionSpecifier]]) -> Result<[Dependency: [Dependency: VersionSpecifier]], CarthageError> {
var invertedRequirements: [Dependency: [Dependency: VersionSpecifier]] = [:]
public static func invert(requirements: Requirements) -> Result<Requirements, CarthageError> {
var invertedRequirements: Requirements = [:]
for (dependency, requirements) in requirements {
for (requiredDependency, requiredVersion) in requirements {
var requirements = invertedRequirements[requiredDependency] ?? [:]
Expand Down
23 changes: 11 additions & 12 deletions Source/CarthageKit/Project.swift
Original file line number Diff line number Diff line change
Expand Up @@ -378,21 +378,21 @@ public final class Project { // swiftlint:disable:this type_body_length
func requirementsByDependency(
resolvedCartfile: ResolvedCartfile,
tryCheckoutDirectory: Bool
) -> SignalProducer<[Dependency: [Dependency: VersionSpecifier]], CarthageError> {
) -> SignalProducer<CompatibilityInfo.Requirements, CarthageError> {
return SignalProducer(value: resolvedCartfile)
.map { resolvedCartfile -> [(Dependency, PinnedVersion)] in
return Array(resolvedCartfile.dependencies)
}
.flatMap(.concurrent(limit: 4)) { dependencies -> SignalProducer<[Dependency: [Dependency: VersionSpecifier]], CarthageError> in
.flatMap(.concurrent(limit: 4)) { dependencies -> SignalProducer<CompatibilityInfo.Requirements, CarthageError> in
return SignalProducer(dependencies)
.flatMap(.merge) { dependencyAndPinnedVersion -> SignalProducer<(Dependency, (Dependency, VersionSpecifier)), CarthageError> in
let (dependency, pinnedVersion) = dependencyAndPinnedVersion
return self.dependencies(for: dependency, version: pinnedVersion, tryCheckoutDirectory: tryCheckoutDirectory)
.map { (dependency, $0) }
}
.collect()
.flatMap(.merge) { dependencyAndRequirements -> SignalProducer<[Dependency: [Dependency: VersionSpecifier]], CarthageError> in
var dict: [Dependency: [Dependency: VersionSpecifier]] = [:]
.flatMap(.merge) { dependencyAndRequirements -> SignalProducer<CompatibilityInfo.Requirements, CarthageError> in
var dict: CompatibilityInfo.Requirements = [:]
for (dependency, requirement) in dependencyAndRequirements {
let (requiredDependency, requiredVersion) = requirement
var requirementsDict = dict[dependency] ?? [:]
Expand Down Expand Up @@ -1154,25 +1154,24 @@ public final class Project { // swiftlint:disable:this type_body_length
.promoteError(CarthageError.self)
.replayLazily(upTo: 1)

let dependencyRequirements = resolvedCartfileProducer
.flatMap(.merge) { (resolved: ResolvedCartfile) -> SignalProducer<[Dependency: [Dependency: VersionSpecifier]], CarthageError> in
let invertedRequirements = resolvedCartfileProducer
.flatMap(.merge) { (resolved: ResolvedCartfile) -> SignalProducer<CompatibilityInfo.Requirements, CarthageError> in
return self.requirementsByDependency(resolvedCartfile: resolved, tryCheckoutDirectory: true)
}
.flatMap(.merge) { requirements -> SignalProducer<[Dependency: [Dependency: VersionSpecifier]], CarthageError> in
.flatMap(.merge) { requirements -> SignalProducer<CompatibilityInfo.Requirements, CarthageError> in
return .init(result: CompatibilityInfo.invert(requirements: requirements))
}

return resolvedCartfileProducer.map { (resolved: ResolvedCartfile) -> [Dependency: PinnedVersion] in
return resolved.dependencies
}
.zip(with: dependencyRequirements)
.flatMap(.concat) { (dependencyInfo: ([Dependency: PinnedVersion], [Dependency: [Dependency: VersionSpecifier]])) ->
SignalProducer<CompatibilityInfo, CarthageError> in
let (resolved, requirements) = dependencyInfo
.zip(with: invertedRequirements)
.flatMap(.concat) { (dependencyInfo: ([Dependency: PinnedVersion], CompatibilityInfo.Requirements)) -> SignalProducer<CompatibilityInfo, CarthageError> in
let (resolved, invertedRequirements) = dependencyInfo
var result: [CompatibilityInfo] = []
resolved.forEach { dependency, pinnedVersion in
// Skip non-semantic resolved versions and transitive dependencies without semantic versions
if case .success = SemanticVersion.from(pinnedVersion), let requirements = requirements[dependency] {
if case .success = SemanticVersion.from(pinnedVersion), let requirements = invertedRequirements[dependency] {
result.append(CompatibilityInfo(dependency: dependency, pinnedVersion: pinnedVersion, requirements: requirements))
}
}
Expand Down

0 comments on commit c557718

Please sign in to comment.