From aaf8268bbd7fe48ca6e83e78c4a2527135393357 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Wed, 26 Jun 2024 23:10:59 -0700 Subject: [PATCH] Create AppConfig module and AppLocations. --- AppConfig/.gitignore | 8 ++++ AppConfig/Package.swift | 23 ++++++++++ .../Sources/AppConfig/AppLocations.swift | 46 +++++++++++++++++++ .../Tests/AppConfigTests/AppConfigTests.swift | 12 +++++ 4 files changed, 89 insertions(+) create mode 100644 AppConfig/.gitignore create mode 100644 AppConfig/Package.swift create mode 100644 AppConfig/Sources/AppConfig/AppLocations.swift create mode 100644 AppConfig/Tests/AppConfigTests/AppConfigTests.swift diff --git a/AppConfig/.gitignore b/AppConfig/.gitignore new file mode 100644 index 000000000..0023a5340 --- /dev/null +++ b/AppConfig/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +/.build +/Packages +xcuserdata/ +DerivedData/ +.swiftpm/configuration/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/AppConfig/Package.swift b/AppConfig/Package.swift new file mode 100644 index 000000000..92ca0f7ca --- /dev/null +++ b/AppConfig/Package.swift @@ -0,0 +1,23 @@ +// swift-tools-version: 5.10 + +import PackageDescription + +let package = Package( + name: "AppConfig", + products: [ + .library( + name: "AppConfig", + targets: ["AppConfig"]), + ], + targets: [ + .target( + name: "AppConfig", + swiftSettings: [ + .enableExperimentalFeature("StrictConcurrency") + ] + ), + .testTarget( + name: "AppConfigTests", + dependencies: ["AppConfig"]), + ] +) diff --git a/AppConfig/Sources/AppConfig/AppLocations.swift b/AppConfig/Sources/AppConfig/AppLocations.swift new file mode 100644 index 000000000..2b0d2e444 --- /dev/null +++ b/AppConfig/Sources/AppConfig/AppLocations.swift @@ -0,0 +1,46 @@ +// +// AppLocations.swift +// NetNewsWire +// +// Created by Brent Simmons on 6/26/24. +// Copyright © 2024 Ranchero Software. All rights reserved. +// + +import Foundation + +@MainActor public final class AppLocations { + + private static var cacheFolder: URL = { + + let folderURL: URL + + if let userCacheFolder = try? FileManager.default.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: true) { + folderURL = userCacheFolder + } else { + let bundleIdentifier = (Bundle.main.infoDictionary!["CFBundleIdentifier"]! as! String) + let tempFolder = (NSTemporaryDirectory() as NSString).appendingPathComponent(bundleIdentifier) + folderURL = URL(fileURLWithPath: tempFolder, isDirectory: true) + try! FileManager.default.createDirectory(at: folderURL, withIntermediateDirectories: true, attributes: nil) + } + + return folderURL + }() + + public static var faviconsFolder: URL = { + return createSubfolder(named: "Favicons", in: cacheFolder) + }() + + public static var imagesFolder: URL = { + return createSubfolder(named: "Images", in: cacheFolder) + }() +} + +private extension AppLocations { + + static func createSubfolder(named subfolderName: String, in folderURL: URL) -> URL { + + let folder = folderURL.appendingPathComponent(subfolderName, isDirectory: true) + try! FileManager.default.createDirectory(at: folder, withIntermediateDirectories: true, attributes: nil) + return folder + } +} diff --git a/AppConfig/Tests/AppConfigTests/AppConfigTests.swift b/AppConfig/Tests/AppConfigTests/AppConfigTests.swift new file mode 100644 index 000000000..a4fcc1da1 --- /dev/null +++ b/AppConfig/Tests/AppConfigTests/AppConfigTests.swift @@ -0,0 +1,12 @@ +import XCTest +@testable import AppConfig + +final class AppConfigTests: XCTestCase { + func testExample() throws { + // XCTest Documentation + // https://developer.apple.com/documentation/xctest + + // Defining Test Cases and Test Methods + // https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods + } +}