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 } 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
} }

View file

@ -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
) )
} }

View file

@ -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
} }
} }

View file

@ -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
} }
} }

View file

@ -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
}
}
} }

View file

@ -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")

View file

@ -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)