mirror of
https://github.com/XcodesOrg/XcodesApp.git
synced 2026-04-26 14:57:37 +00:00
Merge pull request #98 from RobotsAndPencils/matt/AppleDownloadFileSize
Adds a DownloadFileSize when using Apple Data Source
This commit is contained in:
commit
c082fa279b
7 changed files with 52 additions and 10 deletions
|
|
@ -133,7 +133,7 @@ extension AppState {
|
||||||
else { return nil }
|
else { return nil }
|
||||||
|
|
||||||
let url = urlPrefix.appendingPathComponent(xcodeFile.remotePath)
|
let url = urlPrefix.appendingPathComponent(xcodeFile.remotePath)
|
||||||
return AvailableXcode(version: version, url: url, filename: String(xcodeFile.remotePath.suffix(fromLast: "/")), releaseDate: download.dateModified)
|
return AvailableXcode(version: version, url: url, filename: String(xcodeFile.remotePath.suffix(fromLast: "/")), releaseDate: download.dateModified, fileSize: xcodeFile.fileSize)
|
||||||
}
|
}
|
||||||
return xcodes
|
return xcodes
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -459,7 +459,8 @@ class AppState: ObservableObject {
|
||||||
requiredMacOSVersion: availableXcode.requiredMacOSVersion,
|
requiredMacOSVersion: availableXcode.requiredMacOSVersion,
|
||||||
releaseNotesURL: availableXcode.releaseNotesURL,
|
releaseNotesURL: availableXcode.releaseNotesURL,
|
||||||
sdks: availableXcode.sdks,
|
sdks: availableXcode.sdks,
|
||||||
compilers: availableXcode.compilers
|
compilers: availableXcode.compilers,
|
||||||
|
downloadFileSize: availableXcode.fileSize
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ public struct AvailableXcode: Codable {
|
||||||
public let releaseNotesURL: URL?
|
public let releaseNotesURL: URL?
|
||||||
public let sdks: SDKs?
|
public let sdks: SDKs?
|
||||||
public let compilers: Compilers?
|
public let compilers: Compilers?
|
||||||
|
public let fileSize: Int64?
|
||||||
|
|
||||||
public init(
|
public init(
|
||||||
version: Version,
|
version: Version,
|
||||||
|
|
@ -22,7 +23,8 @@ public struct AvailableXcode: Codable {
|
||||||
requiredMacOSVersion: String? = nil,
|
requiredMacOSVersion: String? = nil,
|
||||||
releaseNotesURL: URL? = nil,
|
releaseNotesURL: URL? = nil,
|
||||||
sdks: SDKs? = nil,
|
sdks: SDKs? = nil,
|
||||||
compilers: Compilers? = nil
|
compilers: Compilers? = nil,
|
||||||
|
fileSize: Int64? = nil
|
||||||
) {
|
) {
|
||||||
self.version = version
|
self.version = version
|
||||||
self.url = url
|
self.url = url
|
||||||
|
|
@ -32,5 +34,6 @@ public struct AvailableXcode: Codable {
|
||||||
self.releaseNotesURL = releaseNotesURL
|
self.releaseNotesURL = releaseNotesURL
|
||||||
self.sdks = sdks
|
self.sdks = sdks
|
||||||
self.compilers = compilers
|
self.compilers = compilers
|
||||||
|
self.fileSize = fileSize
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,9 @@ struct Downloads: Codable {
|
||||||
let downloads: [Download]
|
let downloads: [Download]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set to Int64 as ByteCountFormatter uses it.
|
||||||
|
public typealias ByteCount = Int64
|
||||||
|
|
||||||
public struct Download: Codable {
|
public struct Download: Codable {
|
||||||
public let name: String
|
public let name: String
|
||||||
public let files: [File]
|
public let files: [File]
|
||||||
|
|
@ -13,5 +16,6 @@ public struct Download: Codable {
|
||||||
|
|
||||||
public struct File: Codable {
|
public struct File: Codable {
|
||||||
public let remotePath: String
|
public let remotePath: String
|
||||||
|
public let fileSize: ByteCount
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ struct Xcode: Identifiable, CustomStringConvertible {
|
||||||
let releaseNotesURL: URL?
|
let releaseNotesURL: URL?
|
||||||
let sdks: SDKs?
|
let sdks: SDKs?
|
||||||
let compilers: Compilers?
|
let compilers: Compilers?
|
||||||
|
let downloadFileSize: Int64?
|
||||||
|
|
||||||
init(
|
init(
|
||||||
version: Version,
|
version: Version,
|
||||||
|
|
@ -22,7 +23,8 @@ struct Xcode: Identifiable, CustomStringConvertible {
|
||||||
requiredMacOSVersion: String? = nil,
|
requiredMacOSVersion: String? = nil,
|
||||||
releaseNotesURL: URL? = nil,
|
releaseNotesURL: URL? = nil,
|
||||||
sdks: SDKs? = nil,
|
sdks: SDKs? = nil,
|
||||||
compilers: Compilers? = nil
|
compilers: Compilers? = nil,
|
||||||
|
downloadFileSize: Int64? = nil
|
||||||
) {
|
) {
|
||||||
self.version = version
|
self.version = version
|
||||||
self.installState = installState
|
self.installState = installState
|
||||||
|
|
@ -32,6 +34,7 @@ struct Xcode: Identifiable, CustomStringConvertible {
|
||||||
self.releaseNotesURL = releaseNotesURL
|
self.releaseNotesURL = releaseNotesURL
|
||||||
self.sdks = sdks
|
self.sdks = sdks
|
||||||
self.compilers = compilers
|
self.compilers = compilers
|
||||||
|
self.downloadFileSize = downloadFileSize
|
||||||
}
|
}
|
||||||
|
|
||||||
var id: Version { version }
|
var id: Version { version }
|
||||||
|
|
@ -39,4 +42,12 @@ struct Xcode: Identifiable, CustomStringConvertible {
|
||||||
var description: String {
|
var description: String {
|
||||||
version.appleDescription
|
version.appleDescription
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var downloadFileSizeString: String? {
|
||||||
|
if let downloadFileSize = downloadFileSize {
|
||||||
|
return ByteCountFormatter.string(fromByteCount: downloadFileSize, countStyle: .file)
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,8 @@ struct InfoPane: View {
|
||||||
compatibility(for: xcode)
|
compatibility(for: xcode)
|
||||||
sdks(for: xcode)
|
sdks(for: xcode)
|
||||||
compilers(for: xcode)
|
compilers(for: xcode)
|
||||||
|
downloadFileSize(for: xcode)
|
||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -162,6 +163,24 @@ struct InfoPane: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ViewBuilder
|
||||||
|
private func downloadFileSize(for xcode: Xcode) -> some View {
|
||||||
|
// if we've downloaded it no need to show the download size
|
||||||
|
if let downloadFileSize = xcode.downloadFileSizeString, case .notInstalled = xcode.installState {
|
||||||
|
VStack(alignment: .leading) {
|
||||||
|
Text("Download Size")
|
||||||
|
.font(.headline)
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
|
Text("\(downloadFileSize)")
|
||||||
|
.font(.subheadline)
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
EmptyView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
private var empty: some View {
|
private var empty: some View {
|
||||||
VStack {
|
VStack {
|
||||||
|
|
@ -199,7 +218,9 @@ struct InfoPane_Previews: PreviewProvider {
|
||||||
llvm: .init(number: "2.3"),
|
llvm: .init(number: "2.3"),
|
||||||
clang: .init(number: "7.3"),
|
clang: .init(number: "7.3"),
|
||||||
swift: .init(number: "5.3.2")
|
swift: .init(number: "5.3.2")
|
||||||
))
|
),
|
||||||
|
downloadFileSize: 242342424
|
||||||
|
)
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
.previewDisplayName("Populated, Installed, Selected")
|
.previewDisplayName("Populated, Installed, Selected")
|
||||||
|
|
@ -224,7 +245,8 @@ struct InfoPane_Previews: PreviewProvider {
|
||||||
llvm: .init(number: "2.3"),
|
llvm: .init(number: "2.3"),
|
||||||
clang: .init(number: "7.3"),
|
clang: .init(number: "7.3"),
|
||||||
swift: .init(number: "5.3.2")
|
swift: .init(number: "5.3.2")
|
||||||
))
|
),
|
||||||
|
downloadFileSize: 242342424)
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
.previewDisplayName("Populated, Installed, Unselected")
|
.previewDisplayName("Populated, Installed, Unselected")
|
||||||
|
|
@ -249,7 +271,8 @@ struct InfoPane_Previews: PreviewProvider {
|
||||||
llvm: .init(number: "2.3"),
|
llvm: .init(number: "2.3"),
|
||||||
clang: .init(number: "7.3"),
|
clang: .init(number: "7.3"),
|
||||||
swift: .init(number: "5.3.2")
|
swift: .init(number: "5.3.2")
|
||||||
))
|
),
|
||||||
|
downloadFileSize: 242342424)
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
.previewDisplayName("Populated, Uninstalled")
|
.previewDisplayName("Populated, Uninstalled")
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ class AppStateTests: XCTestCase {
|
||||||
}
|
}
|
||||||
// It's an available release version
|
// It's an available release version
|
||||||
else if urlRequest.url! == URLRequest.downloads.url! {
|
else if urlRequest.url! == URLRequest.downloads.url! {
|
||||||
let downloads = Downloads(downloads: [Download(name: "Xcode 0.0.0", files: [Download.File(remotePath: "https://apple.com/xcode.xip")], dateModified: Date())])
|
let downloads = Downloads(downloads: [Download(name: "Xcode 0.0.0", files: [Download.File(remotePath: "https://apple.com/xcode.xip", fileSize: 9484444)], dateModified: Date())])
|
||||||
let encoder = JSONEncoder()
|
let encoder = JSONEncoder()
|
||||||
encoder.dateEncodingStrategy = .formatted(.downloadsDateModified)
|
encoder.dateEncodingStrategy = .formatted(.downloadsDateModified)
|
||||||
let downloadsData = try! encoder.encode(downloads)
|
let downloadsData = try! encoder.encode(downloads)
|
||||||
|
|
@ -199,7 +199,7 @@ class AppStateTests: XCTestCase {
|
||||||
}
|
}
|
||||||
// It's an available release version
|
// It's an available release version
|
||||||
else if urlRequest.url! == URLRequest.downloads.url! {
|
else if urlRequest.url! == URLRequest.downloads.url! {
|
||||||
let downloads = Downloads(downloads: [Download(name: "Xcode 0.0.0", files: [Download.File(remotePath: "https://apple.com/xcode.xip")], dateModified: Date())])
|
let downloads = Downloads(downloads: [Download(name: "Xcode 0.0.0", files: [Download.File(remotePath: "https://apple.com/xcode.xip", fileSize: 9494944)], dateModified: Date())])
|
||||||
let encoder = JSONEncoder()
|
let encoder = JSONEncoder()
|
||||||
encoder.dateEncodingStrategy = .formatted(.downloadsDateModified)
|
encoder.dateEncodingStrategy = .formatted(.downloadsDateModified)
|
||||||
let downloadsData = try! encoder.encode(downloads)
|
let downloadsData = try! encoder.encode(downloads)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue