Merge pull request #98 from RobotsAndPencils/matt/AppleDownloadFileSize

Adds a DownloadFileSize when using Apple Data Source
This commit is contained in:
Matt Kiazyk 2021-02-04 18:27:25 -06:00 committed by GitHub
commit c082fa279b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 52 additions and 10 deletions

View file

@ -133,7 +133,7 @@ extension AppState {
else { return nil }
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
}

View file

@ -459,7 +459,8 @@ class AppState: ObservableObject {
requiredMacOSVersion: availableXcode.requiredMacOSVersion,
releaseNotesURL: availableXcode.releaseNotesURL,
sdks: availableXcode.sdks,
compilers: availableXcode.compilers
compilers: availableXcode.compilers,
downloadFileSize: availableXcode.fileSize
)
}

View file

@ -13,6 +13,7 @@ public struct AvailableXcode: Codable {
public let releaseNotesURL: URL?
public let sdks: SDKs?
public let compilers: Compilers?
public let fileSize: Int64?
public init(
version: Version,
@ -22,7 +23,8 @@ public struct AvailableXcode: Codable {
requiredMacOSVersion: String? = nil,
releaseNotesURL: URL? = nil,
sdks: SDKs? = nil,
compilers: Compilers? = nil
compilers: Compilers? = nil,
fileSize: Int64? = nil
) {
self.version = version
self.url = url
@ -32,5 +34,6 @@ public struct AvailableXcode: Codable {
self.releaseNotesURL = releaseNotesURL
self.sdks = sdks
self.compilers = compilers
self.fileSize = fileSize
}
}

View file

@ -6,6 +6,9 @@ struct Downloads: Codable {
let downloads: [Download]
}
// Set to Int64 as ByteCountFormatter uses it.
public typealias ByteCount = Int64
public struct Download: Codable {
public let name: String
public let files: [File]
@ -13,5 +16,6 @@ public struct Download: Codable {
public struct File: Codable {
public let remotePath: String
public let fileSize: ByteCount
}
}

View file

@ -13,6 +13,7 @@ struct Xcode: Identifiable, CustomStringConvertible {
let releaseNotesURL: URL?
let sdks: SDKs?
let compilers: Compilers?
let downloadFileSize: Int64?
init(
version: Version,
@ -22,7 +23,8 @@ struct Xcode: Identifiable, CustomStringConvertible {
requiredMacOSVersion: String? = nil,
releaseNotesURL: URL? = nil,
sdks: SDKs? = nil,
compilers: Compilers? = nil
compilers: Compilers? = nil,
downloadFileSize: Int64? = nil
) {
self.version = version
self.installState = installState
@ -32,6 +34,7 @@ struct Xcode: Identifiable, CustomStringConvertible {
self.releaseNotesURL = releaseNotesURL
self.sdks = sdks
self.compilers = compilers
self.downloadFileSize = downloadFileSize
}
var id: Version { version }
@ -39,4 +42,12 @@ struct Xcode: Identifiable, CustomStringConvertible {
var description: String {
version.appleDescription
}
var downloadFileSizeString: String? {
if let downloadFileSize = downloadFileSize {
return ByteCountFormatter.string(fromByteCount: downloadFileSize, countStyle: .file)
} else {
return nil
}
}
}

View file

@ -56,7 +56,8 @@ struct InfoPane: View {
compatibility(for: xcode)
sdks(for: xcode)
compilers(for: xcode)
downloadFileSize(for: xcode)
Spacer()
}
} 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
private var empty: some View {
VStack {
@ -199,7 +218,9 @@ struct InfoPane_Previews: PreviewProvider {
llvm: .init(number: "2.3"),
clang: .init(number: "7.3"),
swift: .init(number: "5.3.2")
))
),
downloadFileSize: 242342424
)
]
})
.previewDisplayName("Populated, Installed, Selected")
@ -224,7 +245,8 @@ struct InfoPane_Previews: PreviewProvider {
llvm: .init(number: "2.3"),
clang: .init(number: "7.3"),
swift: .init(number: "5.3.2")
))
),
downloadFileSize: 242342424)
]
})
.previewDisplayName("Populated, Installed, Unselected")
@ -249,7 +271,8 @@ struct InfoPane_Previews: PreviewProvider {
llvm: .init(number: "2.3"),
clang: .init(number: "7.3"),
swift: .init(number: "5.3.2")
))
),
downloadFileSize: 242342424)
]
})
.previewDisplayName("Populated, Uninstalled")

View file

@ -89,7 +89,7 @@ class AppStateTests: XCTestCase {
}
// It's an available release version
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()
encoder.dateEncodingStrategy = .formatted(.downloadsDateModified)
let downloadsData = try! encoder.encode(downloads)
@ -199,7 +199,7 @@ class AppStateTests: XCTestCase {
}
// It's an available release version
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()
encoder.dateEncodingStrategy = .formatted(.downloadsDateModified)
let downloadsData = try! encoder.encode(downloads)