diff --git a/CLAUDE.md b/CLAUDE.md index 296605b..143e2a5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -36,3 +36,13 @@ API endpoint: `https://www.bing.com/HPImageArchive.aspx?format=js&idx={idx}&n={c - Bundle ID: `com.colachg.Wallpaper` - `LSUIElement: true` (menu bar only, no dock icon) - Info.plist lives in `Resources/` and is copied into the bundle by `just bundle` + +## Active Technologies +- Swift 6.2+ (strict concurrency mode) + SwiftUI, AppKit (Apple frameworks only) (002-refactor-favorites-ux) +- File-based — JSON preferences, cached JPEG images (002-refactor-favorites-ux) +- Swift 6.2+ (strict concurrency) + SwiftUI, AppKit, Foundation (003-fix-dislike-behavior) +- File-based (JSON preferences, cached JPEGs) (003-fix-dislike-behavior) +- File-based — JSON preferences at `~/Library/Application Support/BingWallpaper/preferences.json` (004-sort-favorites-by-date) + +## Recent Changes +- 002-refactor-favorites-ux: Added Swift 6.2+ (strict concurrency mode) + SwiftUI, AppKit (Apple frameworks only) diff --git a/Resources/Info.plist b/Resources/Info.plist index 0254a8f..50233db 100644 --- a/Resources/Info.plist +++ b/Resources/Info.plist @@ -9,9 +9,9 @@ CFBundleExecutable Wallpaper CFBundleVersion - 1.1.2 + 1.1.3 CFBundleShortVersionString - 1.1.2 + 1.1.3 CFBundlePackageType APPL CFBundleIconFile diff --git a/Sources/Wallpaper/WallpaperManager.swift b/Sources/Wallpaper/WallpaperManager.swift index d151efb..a7b35d2 100644 --- a/Sources/Wallpaper/WallpaperManager.swift +++ b/Sources/Wallpaper/WallpaperManager.swift @@ -46,7 +46,7 @@ class WallpaperManager { } var favoriteImages: [BingImage] { - store.preferences.favorites + store.preferences.favorites.sorted { $0.startdate > $1.startdate } } var currentFavorite: BingImage? { diff --git a/Tests/WallpaperTests/PreferencesTests.swift b/Tests/WallpaperTests/PreferencesTests.swift index 3fd323c..57edca5 100644 --- a/Tests/WallpaperTests/PreferencesTests.swift +++ b/Tests/WallpaperTests/PreferencesTests.swift @@ -176,6 +176,36 @@ struct PreferencesStoreTests { #expect(store.preferences.favorites.isEmpty) } + @Test("favoriteImages returns favorites sorted by startdate descending") + @MainActor func favoritesSortedByDate() { + let store = makeStore() + // Add favorites in non-chronological order + store.addFavorite(BingImage(startdate: "20260215", urlbase: "/1", copyright: "©", title: "Jan 15")) + store.addFavorite(BingImage(startdate: "20260220", urlbase: "/2", copyright: "©", title: "Jan 20")) + store.addFavorite(BingImage(startdate: "20260210", urlbase: "/3", copyright: "©", title: "Jan 10")) + + let sorted = store.preferences.favorites.sorted { $0.startdate > $1.startdate } + #expect(sorted[0].startdate == "20260220") + #expect(sorted[1].startdate == "20260215") + #expect(sorted[2].startdate == "20260210") + } + + @Test("newly added favorite maintains date-sorted order") + @MainActor func newFavoriteMaintainsDateOrder() { + let store = makeStore() + // Add initial favorites + store.addFavorite(BingImage(startdate: "20260210", urlbase: "/1", copyright: "©", title: "Jan 10")) + store.addFavorite(BingImage(startdate: "20260220", urlbase: "/2", copyright: "©", title: "Jan 20")) + // Add a new favorite with a date between the existing ones + store.addFavorite(BingImage(startdate: "20260215", urlbase: "/3", copyright: "©", title: "Jan 15")) + + let sorted = store.preferences.favorites.sorted { $0.startdate > $1.startdate } + #expect(sorted.count == 3) + #expect(sorted[0].startdate == "20260220") + #expect(sorted[1].startdate == "20260215") + #expect(sorted[2].startdate == "20260210") + } + @Test("load with corrupted file resets to defaults") @MainActor func loadCorrupted() { let url = FileManager.default.temporaryDirectory