File: MockDependency.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (160 lines) | stat: -rw-r--r-- 7,904 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2014-2020 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

import Basics
import Foundation
import PackageLoading
import PackageModel

public typealias SourceControlRequirement = PackageDependency.SourceControl.Requirement
public typealias RegistryRequirement = PackageDependency.Registry.Requirement

public struct MockDependency {
    public let deprecatedName: String?
    public let location: Location
    public let products: ProductFilter

    init(deprecatedName: String? = nil, location: Location, products: ProductFilter = .everything) {
        self.deprecatedName = deprecatedName
        self.location = location
        self.products = products
    }

    public func convert(baseURL: AbsolutePath, identityResolver: IdentityResolver) throws -> PackageDependency {
        switch self.location {
        case .fileSystem(let path):
            let absolutePath = baseURL.appending(path)
            let mappedLocation = identityResolver.mappedLocation(for: absolutePath.pathString)
            guard let mappedPath = try? AbsolutePath(validating: mappedLocation) else {
                throw StringError("invalid mapping of '\(path)' to '\(mappedLocation)', no requirement information available.")
            }
            let identity = try identityResolver.resolveIdentity(for: mappedPath)
            return .fileSystem(
                identity: identity,
                deprecatedName: self.deprecatedName,
                path: mappedPath,
                productFilter: self.products
            )
        case .localSourceControl(let path, let requirement):
            let absolutePath = baseURL.appending(path)
            let mappedLocation = identityResolver.mappedLocation(for: absolutePath.pathString)
            guard let mappedPath = try? AbsolutePath(validating: mappedLocation) else {
                throw StringError("invalid mapping of '\(path)' to '\(mappedLocation)', no requirement information available.")
            }
            let identity = try identityResolver.resolveIdentity(for: mappedPath)
            return .localSourceControl(
                identity: identity,
                deprecatedName: self.deprecatedName,
                path: mappedPath,
                requirement: requirement,
                productFilter: self.products
            )
        case .remoteSourceControl(let url, let _requirement):
            let mappedLocation = identityResolver.mappedLocation(for: url.absoluteString)
            if PackageIdentity.plain(mappedLocation).isRegistry {
                let identity = PackageIdentity.plain(mappedLocation)
                let requirement: RegistryRequirement
                switch _requirement {
                case .branch, .revision:
                    throw StringError("invalid mapping of source control to registry, requirement information mismatch.")
                case .exact(let value):
                    requirement = .exact(value)
                case .range(let value):
                    requirement = .range(value)
                }
                return .registry(
                    identity: identity,
                    requirement: requirement,
                    productFilter: self.products
                )

            } else {
                let mappedURL = SourceControlURL(mappedLocation)
                let identity = try identityResolver.resolveIdentity(for: mappedURL)
                return .remoteSourceControl(
                    identity: identity,
                    deprecatedName: self.deprecatedName,
                    url: mappedURL,
                    requirement: _requirement,
                    productFilter: self.products
                )
            }
        case .registry(let identity, let _requirement):
            let mappedLocation = identityResolver.mappedLocation(for: identity.description)
            if PackageIdentity.plain(mappedLocation).isRegistry {
                let identity = PackageIdentity.plain(mappedLocation)
                return .registry(
                    identity: identity,
                    requirement: _requirement,
                    productFilter: self.products
                )
            } else {
                let mappedURL = SourceControlURL(mappedLocation)
                let identity = try identityResolver.resolveIdentity(for: mappedURL)
                let requirement: SourceControlRequirement
                switch _requirement {
                case .exact(let value):
                    requirement = .exact(value)
                case .range(let value):
                    requirement = .range(value)
                }
                return .remoteSourceControl(
                    identity: identity,
                    deprecatedName: self.deprecatedName,
                    url: mappedURL,
                    requirement: requirement,
                    productFilter: self.products
                )
            }
        }
        
    }

    public static func fileSystem(path: String, products: ProductFilter = .everything) -> MockDependency {
        try! MockDependency(location: .fileSystem(path: RelativePath(validating: path)), products: products)
    }

    public static func sourceControl(path: String, requirement: SourceControlRequirement, products: ProductFilter = .everything) -> MockDependency {
        try! .sourceControl(path: RelativePath(validating: path), requirement: requirement, products: products)
    }

    public static func sourceControl(path: RelativePath, requirement: SourceControlRequirement, products: ProductFilter = .everything) -> MockDependency {
        MockDependency(location: .localSourceControl(path: path, requirement: requirement), products: products)
    }

    public static func sourceControlWithDeprecatedName(name: String, path: String, requirement: SourceControlRequirement, products: ProductFilter = .everything) -> MockDependency {
        try! MockDependency(deprecatedName: name, location: .localSourceControl(path: RelativePath(validating: path), requirement: requirement), products: products)
    }

    public static func sourceControl(url: String, requirement: SourceControlRequirement, products: ProductFilter = .everything) -> MockDependency {
        .sourceControl(url: SourceControlURL(url), requirement: requirement, products: products)
    }

    public static func sourceControl(url: SourceControlURL, requirement: SourceControlRequirement, products: ProductFilter = .everything) -> MockDependency {
        MockDependency(location: .remoteSourceControl(url: url, requirement: requirement), products: products)
    }

    public static func registry(identity: String, requirement: RegistryRequirement, products: ProductFilter = .everything) -> MockDependency {
        .registry(identity: .plain(identity), requirement: requirement)
    }

    public static func registry(identity: PackageIdentity, requirement: RegistryRequirement, products: ProductFilter = .everything) -> MockDependency {
        MockDependency(location: .registry(identity: identity, requirement: requirement), products: products)
    }

    public enum Location {
        case fileSystem(path: RelativePath)
        case localSourceControl(path: RelativePath, requirement: SourceControlRequirement)
        case remoteSourceControl(url: SourceControlURL, requirement: SourceControlRequirement)
        case registry(identity: PackageIdentity, requirement: RegistryRequirement)
    }
}