Merge branch 'master' of https://github.com/brentsimmons/Evergreen into safari-extension
# Conflicts: # Evergreen.xcodeproj/project.pbxproj
This commit is contained in:
commit
3492b59707
18
.gitmodules
vendored
Normal file
18
.gitmodules
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
[submodule "submodules/RSCore"]
|
||||
path = submodules/RSCore
|
||||
url = https://github.com/brentsimmons/RSCore
|
||||
[submodule "submodules/DB5"]
|
||||
path = submodules/DB5
|
||||
url = https://github.com/brentsimmons/DB5
|
||||
[submodule "submodules/RSWeb"]
|
||||
path = submodules/RSWeb
|
||||
url = https://github.com/brentsimmons/RSWeb
|
||||
[submodule "submodules/RSParser"]
|
||||
path = submodules/RSParser
|
||||
url = https://github.com/brentsimmons/RSParser
|
||||
[submodule "submodules/RSTree"]
|
||||
path = submodules/RSTree
|
||||
url = https://github.com/brentsimmons/RSTree
|
||||
[submodule "submodules/RSDatabase"]
|
||||
path = submodules/RSDatabase
|
||||
url = https://github.com/brentsimmons/RSDatabase
|
@ -10,7 +10,7 @@ import Foundation
|
||||
import RSCore
|
||||
import RSTree
|
||||
import Account
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
final class DeleteFromSidebarCommand: UndoableCommand {
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import RSCore
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
// Mark articles read/unread, starred/unstarred, deleted/undeleted.
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import AppKit
|
||||
import RSCore
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
final class SendToMarsEditCommand: SendToCommand {
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
import RSCore
|
||||
|
||||
// Not undoable.
|
||||
|
@ -21,12 +21,13 @@
|
||||
840D618B2029031D009BC708 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 840D61892029031D009BC708 /* LaunchScreen.storyboard */; };
|
||||
840D61962029031D009BC708 /* Evergreen_iOSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840D61952029031D009BC708 /* Evergreen_iOSTests.swift */; };
|
||||
840D61A12029031E009BC708 /* Evergreen_iOSUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840D61A02029031E009BC708 /* Evergreen_iOSUITests.swift */; };
|
||||
8414AD251FCF5A1E00955102 /* TimelineHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8414AD241FCF5A1E00955102 /* TimelineHeaderView.swift */; };
|
||||
84162A152038C12C00035290 /* MarkCommandValidationStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84162A142038C12C00035290 /* MarkCommandValidationStatus.swift */; };
|
||||
84162A252038C1E000035290 /* TimelineDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84162A242038C1E000035290 /* TimelineDataSource.swift */; };
|
||||
841ABA4E20145E7300980E11 /* NothingInspectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841ABA4D20145E7300980E11 /* NothingInspectorViewController.swift */; };
|
||||
841ABA5E20145E9200980E11 /* FolderInspectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841ABA5D20145E9200980E11 /* FolderInspectorViewController.swift */; };
|
||||
841ABA6020145EC100980E11 /* BuiltinSmartFeedInspectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841ABA5F20145EC100980E11 /* BuiltinSmartFeedInspectorViewController.swift */; };
|
||||
841D4D6B2106B3ED00DD04E6 /* Articles.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841D4D5B2106B3D600DD04E6 /* Articles.framework */; };
|
||||
841D4D6C2106B3ED00DD04E6 /* Articles.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 841D4D5B2106B3D600DD04E6 /* Articles.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
8426118A1FCB67AA0086A189 /* FeedIconDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842611891FCB67AA0086A189 /* FeedIconDownloader.swift */; };
|
||||
8426119E1FCB6ED40086A189 /* HTMLMetadataDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8426119D1FCB6ED40086A189 /* HTMLMetadataDownloader.swift */; };
|
||||
842611A01FCB72600086A189 /* FeaturedImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8426119F1FCB72600086A189 /* FeaturedImageDownloader.swift */; };
|
||||
@ -54,8 +55,6 @@
|
||||
845F52ED1FB2B9FC00C10BF0 /* FeedPasteboardWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845F52EC1FB2B9FC00C10BF0 /* FeedPasteboardWriter.swift */; };
|
||||
846E773D1F6EF67A00A165E2 /* Account.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 846E773A1F6EF5D700A165E2 /* Account.framework */; };
|
||||
846E773E1F6EF67A00A165E2 /* Account.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 846E773A1F6EF5D700A165E2 /* Account.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
846E77411F6EF6A100A165E2 /* Database.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 846E77211F6EF5D100A165E2 /* Database.framework */; };
|
||||
846E77421F6EF6A100A165E2 /* Database.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 846E77211F6EF5D100A165E2 /* Database.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
84702AA41FA27AC0006B8943 /* MarkStatusCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84702AA31FA27AC0006B8943 /* MarkStatusCommand.swift */; };
|
||||
8472058120142E8900AD578B /* FeedInspectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8472058020142E8900AD578B /* FeedInspectorViewController.swift */; };
|
||||
847FA121202BA34100BB56C8 /* SidebarContextualMenuDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 847FA120202BA34100BB56C8 /* SidebarContextualMenuDelegate.swift */; };
|
||||
@ -115,20 +114,26 @@
|
||||
84AD1EAA2031617300BC20B7 /* FolderPasteboardWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AD1EA92031617300BC20B7 /* FolderPasteboardWriter.swift */; };
|
||||
84AD1EBA2031649C00BC20B7 /* SmartFeedPasteboardWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AD1EB92031649C00BC20B7 /* SmartFeedPasteboardWriter.swift */; };
|
||||
84AD1EBC2032AF5C00BC20B7 /* SidebarOutlineDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AD1EBB2032AF5C00BC20B7 /* SidebarOutlineDataSource.swift */; };
|
||||
84B06FCF1ED37F7D00F0B54B /* DB5.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84B06FCC1ED37F7200F0B54B /* DB5.framework */; };
|
||||
84B06FD01ED37F7D00F0B54B /* DB5.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84B06FCC1ED37F7200F0B54B /* DB5.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
84B06FE91ED3803A00F0B54B /* RSFeedFinder.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84B06FE61ED3803200F0B54B /* RSFeedFinder.framework */; };
|
||||
84B06FEA1ED3803A00F0B54B /* RSFeedFinder.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84B06FE61ED3803200F0B54B /* RSFeedFinder.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
84B7178C201E66580091657D /* SidebarViewController+ContextualMenus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B7178B201E66580091657D /* SidebarViewController+ContextualMenus.swift */; };
|
||||
84B99C671FAE35E600ECDEDB /* FeedListTreeControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B99C661FAE35E600ECDEDB /* FeedListTreeControllerDelegate.swift */; };
|
||||
84B99C691FAE36B800ECDEDB /* FeedListFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B99C681FAE36B800ECDEDB /* FeedListFolder.swift */; };
|
||||
84B99C6B1FAE370B00ECDEDB /* FeedListFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B99C6A1FAE370B00ECDEDB /* FeedListFeed.swift */; };
|
||||
84B99C9D1FAE83C600ECDEDB /* DeleteFromSidebarCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B99C9C1FAE83C600ECDEDB /* DeleteFromSidebarCommand.swift */; };
|
||||
84BB4B771F11753300858766 /* Data.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84BB4B681F1174D400858766 /* Data.framework */; };
|
||||
84BB4B781F11753300858766 /* Data.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84BB4B681F1174D400858766 /* Data.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
84BBB12D20142A4700F054F5 /* Inspector.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84BBB12B20142A4700F054F5 /* Inspector.storyboard */; };
|
||||
84BBB12E20142A4700F054F5 /* InspectorWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84BBB12C20142A4700F054F5 /* InspectorWindowController.swift */; };
|
||||
84C12A151FF5B0080009A267 /* FeedList.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84C12A141FF5B0080009A267 /* FeedList.storyboard */; };
|
||||
84C37FA520DD8D8400CA8CF5 /* RSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8120DD8CF200CA8CF5 /* RSCore.framework */; };
|
||||
84C37FA620DD8D8400CA8CF5 /* RSCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8120DD8CF200CA8CF5 /* RSCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
84C37FA920DD8D9000CA8CF5 /* RSWeb.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F9F20DD8D0500CA8CF5 /* RSWeb.framework */; };
|
||||
84C37FAA20DD8D9000CA8CF5 /* RSWeb.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F9F20DD8D0500CA8CF5 /* RSWeb.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
84C37FAD20DD8D9900CA8CF5 /* RSTree.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F9520DD8CFE00CA8CF5 /* RSTree.framework */; };
|
||||
84C37FAE20DD8D9900CA8CF5 /* RSTree.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F9520DD8CFE00CA8CF5 /* RSTree.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
84C37FB120DD8DA100CA8CF5 /* DB5.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F2820DD8CCE00CA8CF5 /* DB5.framework */; };
|
||||
84C37FB220DD8DA100CA8CF5 /* DB5.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F2820DD8CCE00CA8CF5 /* DB5.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
84C37FB520DD8DBB00CA8CF5 /* RSParser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8C20DD8CF800CA8CF5 /* RSParser.framework */; };
|
||||
84C37FB620DD8DBB00CA8CF5 /* RSParser.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8C20DD8CF800CA8CF5 /* RSParser.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
84C37FC520DD8E1D00CA8CF5 /* RSDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37FC020DD8E0C00CA8CF5 /* RSDatabase.framework */; };
|
||||
84C37FC620DD8E1D00CA8CF5 /* RSDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37FC020DD8E0C00CA8CF5 /* RSDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
84CC88181FE59CBF00644329 /* SmartFeedsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CC88171FE59CBF00644329 /* SmartFeedsController.swift */; };
|
||||
84D52E951FE588BB00D14F5B /* DetailStatusBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D52E941FE588BB00D14F5B /* DetailStatusBarView.swift */; };
|
||||
84D5BA20201E8FB6009092BD /* SidebarGearMenuDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D5BA1F201E8FB6009092BD /* SidebarGearMenuDelegate.swift */; };
|
||||
@ -148,6 +153,12 @@
|
||||
84F2D5371FC22FCC00998D64 /* PseudoFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F2D5351FC22FCB00998D64 /* PseudoFeed.swift */; };
|
||||
84F2D5381FC22FCC00998D64 /* TodayFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F2D5361FC22FCB00998D64 /* TodayFeedDelegate.swift */; };
|
||||
84F2D53A1FC2308B00998D64 /* UnreadFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F2D5391FC2308B00998D64 /* UnreadFeed.swift */; };
|
||||
84F3EE1620DEC97E003FADEB /* FeedFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F3EE0620DEC97E003FADEB /* FeedFinder.swift */; };
|
||||
84F3EE1720DEC97E003FADEB /* FeedFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F3EE0620DEC97E003FADEB /* FeedFinder.swift */; };
|
||||
84F3EE1820DEC97E003FADEB /* FeedSpecifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F3EE0720DEC97E003FADEB /* FeedSpecifier.swift */; };
|
||||
84F3EE1920DEC97E003FADEB /* FeedSpecifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F3EE0720DEC97E003FADEB /* FeedSpecifier.swift */; };
|
||||
84F3EE1A20DEC97E003FADEB /* HTMLFeedFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F3EE0820DEC97E003FADEB /* HTMLFeedFinder.swift */; };
|
||||
84F3EE1B20DEC97E003FADEB /* HTMLFeedFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F3EE0820DEC97E003FADEB /* HTMLFeedFinder.swift */; };
|
||||
84FB9A2F1EDCD6C4003D53B9 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84FB9A2D1EDCD6B8003D53B9 /* Sparkle.framework */; };
|
||||
84FB9A301EDCD6C4003D53B9 /* Sparkle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84FB9A2D1EDCD6B8003D53B9 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
84FF69B11FC3793300DC198E /* FaviconURLFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84FF69B01FC3793300DC198E /* FaviconURLFinder.swift */; };
|
||||
@ -220,19 +231,40 @@
|
||||
remoteGlobalIDString = 840D617B2029031C009BC708;
|
||||
remoteInfo = "Evergreen-iOS";
|
||||
};
|
||||
846E77201F6EF5D100A165E2 /* PBXContainerItemProxy */ = {
|
||||
841D4D5A2106B3D600DD04E6 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 846E77161F6EF5D000A165E2 /* Database.xcodeproj */;
|
||||
containerPortal = 841D4D542106B3D500DD04E6 /* Articles.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 844BEE5B1F0AB3C8004AB7CD;
|
||||
remoteInfo = Articles;
|
||||
};
|
||||
841D4D5C2106B3D600DD04E6 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 841D4D542106B3D500DD04E6 /* Articles.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 844BEE641F0AB3C9004AB7CD;
|
||||
remoteInfo = ArticlesTests;
|
||||
};
|
||||
841D4D672106B3E100DD04E6 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 841D4D5E2106B3E100DD04E6 /* ArticlesDatabase.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 844BEE371F0AB3AA004AB7CD;
|
||||
remoteInfo = Database;
|
||||
remoteInfo = ArticlesDatabase;
|
||||
};
|
||||
846E77221F6EF5D100A165E2 /* PBXContainerItemProxy */ = {
|
||||
841D4D692106B3E100DD04E6 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 846E77161F6EF5D000A165E2 /* Database.xcodeproj */;
|
||||
containerPortal = 841D4D5E2106B3E100DD04E6 /* ArticlesDatabase.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 844BEE401F0AB3AB004AB7CD;
|
||||
remoteInfo = DatabaseTests;
|
||||
remoteInfo = ArticlesDatabaseTests;
|
||||
};
|
||||
841D4D6D2106B3ED00DD04E6 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 841D4D542106B3D500DD04E6 /* Articles.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 844BEE5A1F0AB3C8004AB7CD;
|
||||
remoteInfo = Articles;
|
||||
};
|
||||
846E77391F6EF5D700A165E2 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
@ -255,13 +287,6 @@
|
||||
remoteGlobalIDString = 848934F51F62484F00CEBD24;
|
||||
remoteInfo = Account;
|
||||
};
|
||||
846E77431F6EF6A100A165E2 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 846E77161F6EF5D000A165E2 /* Database.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 844BEE361F0AB3AA004AB7CD;
|
||||
remoteInfo = Database;
|
||||
};
|
||||
849C64721ED37A5D003D8FC0 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 849C64581ED37A5D003D8FC0 /* Project object */;
|
||||
@ -269,68 +294,152 @@
|
||||
remoteGlobalIDString = 849C645F1ED37A5D003D8FC0;
|
||||
remoteInfo = Evergreen;
|
||||
};
|
||||
84B06FCB1ED37F7200F0B54B /* PBXContainerItemProxy */ = {
|
||||
84C37F2720DD8CCE00CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84B06FC61ED37F7200F0B54B /* DB5.xcodeproj */;
|
||||
containerPortal = 84C37F2220DD8CCD00CA8CF5 /* DB5.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 84F22BD11B52DC2E000060CE;
|
||||
remoteInfo = DB5;
|
||||
};
|
||||
84B06FCD1ED37F7200F0B54B /* PBXContainerItemProxy */ = {
|
||||
84C37F2920DD8CCE00CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84B06FC61ED37F7200F0B54B /* DB5.xcodeproj */;
|
||||
containerPortal = 84C37F2220DD8CCD00CA8CF5 /* DB5.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 84F22BDB1B52DC2E000060CE;
|
||||
remoteInfo = DB5Tests;
|
||||
};
|
||||
84B06FD11ED37F7D00F0B54B /* PBXContainerItemProxy */ = {
|
||||
84C37F8020DD8CF200CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84B06FC61ED37F7200F0B54B /* DB5.xcodeproj */;
|
||||
containerPortal = 84C37F7A20DD8CF200CA8CF5 /* RSCore.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 84CFF4F41AC3C69700CEA6C8;
|
||||
remoteInfo = RSCore;
|
||||
};
|
||||
84C37F8220DD8CF200CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37F7A20DD8CF200CA8CF5 /* RSCore.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 84CFF4FF1AC3C69700CEA6C8;
|
||||
remoteInfo = RSCoreTests;
|
||||
};
|
||||
84C37F8420DD8CF200CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37F7A20DD8CF200CA8CF5 /* RSCore.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 842DD7BC1E14993900E061EB;
|
||||
remoteInfo = RSCoreiOS;
|
||||
};
|
||||
84C37F8B20DD8CF800CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37F8620DD8CF800CA8CF5 /* RSParser.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 84FF5F841EFA285800C15A01;
|
||||
remoteInfo = RSParser;
|
||||
};
|
||||
84C37F8D20DD8CF800CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37F8620DD8CF800CA8CF5 /* RSParser.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 84FF5F8D1EFA285800C15A01;
|
||||
remoteInfo = RSParserTests;
|
||||
};
|
||||
84C37F9420DD8CFE00CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37F8F20DD8CFD00CA8CF5 /* RSTree.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 842A0BE11CFCB9BC00BF746C;
|
||||
remoteInfo = RSTree;
|
||||
};
|
||||
84C37F9620DD8CFE00CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37F8F20DD8CFD00CA8CF5 /* RSTree.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 842A0BEB1CFCB9BC00BF746C;
|
||||
remoteInfo = RSTreeTests;
|
||||
};
|
||||
84C37F9E20DD8D0500CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37F9820DD8D0400CA8CF5 /* RSWeb.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 849C08B61E0CAC85006B03FA;
|
||||
remoteInfo = RSWeb;
|
||||
};
|
||||
84C37FA020DD8D0500CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37F9820DD8D0400CA8CF5 /* RSWeb.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 849C08BF1E0CAC86006B03FA;
|
||||
remoteInfo = RSWebTests;
|
||||
};
|
||||
84C37FA220DD8D0500CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37F9820DD8D0400CA8CF5 /* RSWeb.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 849C08D51E0CACA3006B03FA;
|
||||
remoteInfo = RSWebiOS;
|
||||
};
|
||||
84C37FA720DD8D8400CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37F7A20DD8CF200CA8CF5 /* RSCore.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 84CFF4F31AC3C69700CEA6C8;
|
||||
remoteInfo = RSCore;
|
||||
};
|
||||
84C37FAB20DD8D9000CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37F9820DD8D0400CA8CF5 /* RSWeb.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 849C08B51E0CAC85006B03FA;
|
||||
remoteInfo = RSWeb;
|
||||
};
|
||||
84C37FAF20DD8D9900CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37F8F20DD8CFD00CA8CF5 /* RSTree.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 842A0BE01CFCB9BC00BF746C;
|
||||
remoteInfo = RSTree;
|
||||
};
|
||||
84C37FB320DD8DA100CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37F2220DD8CCD00CA8CF5 /* DB5.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 84F22BD01B52DC2E000060CE;
|
||||
remoteInfo = DB5;
|
||||
};
|
||||
84B06FE51ED3803200F0B54B /* PBXContainerItemProxy */ = {
|
||||
84C37FB720DD8DBB00CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84B06FE01ED3803200F0B54B /* RSFeedFinder.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 84BAAE1F1C8E6B3B009F5239;
|
||||
remoteInfo = RSFeedFinder;
|
||||
};
|
||||
84B06FE71ED3803200F0B54B /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84B06FE01ED3803200F0B54B /* RSFeedFinder.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 84BAAE291C8E6B3B009F5239;
|
||||
remoteInfo = RSFeedFinderTests;
|
||||
};
|
||||
84B06FEB1ED3803A00F0B54B /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84B06FE01ED3803200F0B54B /* RSFeedFinder.xcodeproj */;
|
||||
containerPortal = 84C37F8620DD8CF800CA8CF5 /* RSParser.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 84BAAE1E1C8E6B3B009F5239;
|
||||
remoteInfo = RSFeedFinder;
|
||||
remoteGlobalIDString = 84FF5F831EFA285800C15A01;
|
||||
remoteInfo = RSParser;
|
||||
};
|
||||
84BB4B671F1174D400858766 /* PBXContainerItemProxy */ = {
|
||||
84C37FBF20DD8E0C00CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84BB4B611F1174D400858766 /* Data.xcodeproj */;
|
||||
containerPortal = 84C37FB920DD8E0C00CA8CF5 /* RSDatabase.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 844BEE5B1F0AB3C8004AB7CD;
|
||||
remoteInfo = Data;
|
||||
remoteGlobalIDString = 84F22C551B52E0D9000060CE;
|
||||
remoteInfo = RSDatabase;
|
||||
};
|
||||
84BB4B691F1174D400858766 /* PBXContainerItemProxy */ = {
|
||||
84C37FC120DD8E0C00CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84BB4B611F1174D400858766 /* Data.xcodeproj */;
|
||||
containerPortal = 84C37FB920DD8E0C00CA8CF5 /* RSDatabase.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 844BEE641F0AB3C9004AB7CD;
|
||||
remoteInfo = DataTests;
|
||||
remoteGlobalIDString = 84F22C5F1B52E0D9000060CE;
|
||||
remoteInfo = RSDatabaseTests;
|
||||
};
|
||||
84BB4B791F11753300858766 /* PBXContainerItemProxy */ = {
|
||||
84C37FC320DD8E0C00CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84BB4B611F1174D400858766 /* Data.xcodeproj */;
|
||||
containerPortal = 84C37FB920DD8E0C00CA8CF5 /* RSDatabase.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 8400ABF71E0CFBD800AA7C57;
|
||||
remoteInfo = RSDatabaseiOS;
|
||||
};
|
||||
84C37FC720DD8E1D00CA8CF5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 84C37FB920DD8E0C00CA8CF5 /* RSDatabase.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 844BEE5A1F0AB3C8004AB7CD;
|
||||
remoteInfo = Data;
|
||||
remoteGlobalIDString = 84F22C541B52E0D9000060CE;
|
||||
remoteInfo = RSDatabase;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
@ -352,12 +461,15 @@
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
84BB4B781F11753300858766 /* Data.framework in Embed Frameworks */,
|
||||
84C37FAA20DD8D9000CA8CF5 /* RSWeb.framework in Embed Frameworks */,
|
||||
84C37FC620DD8E1D00CA8CF5 /* RSDatabase.framework in Embed Frameworks */,
|
||||
84C37FAE20DD8D9900CA8CF5 /* RSTree.framework in Embed Frameworks */,
|
||||
84FB9A301EDCD6C4003D53B9 /* Sparkle.framework in Embed Frameworks */,
|
||||
846E77421F6EF6A100A165E2 /* Database.framework in Embed Frameworks */,
|
||||
84B06FEA1ED3803A00F0B54B /* RSFeedFinder.framework in Embed Frameworks */,
|
||||
84C37FB220DD8DA100CA8CF5 /* DB5.framework in Embed Frameworks */,
|
||||
84C37FB620DD8DBB00CA8CF5 /* RSParser.framework in Embed Frameworks */,
|
||||
84C37FA620DD8D8400CA8CF5 /* RSCore.framework in Embed Frameworks */,
|
||||
846E773E1F6EF67A00A165E2 /* Account.framework in Embed Frameworks */,
|
||||
84B06FD01ED37F7D00F0B54B /* DB5.framework in Embed Frameworks */,
|
||||
841D4D6C2106B3ED00DD04E6 /* Articles.framework in Embed Frameworks */,
|
||||
);
|
||||
name = "Embed Frameworks";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@ -413,12 +525,13 @@
|
||||
840D619C2029031D009BC708 /* Evergreen-iOSUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Evergreen-iOSUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
840D61A02029031E009BC708 /* Evergreen_iOSUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Evergreen_iOSUITests.swift; sourceTree = "<group>"; };
|
||||
840D61A22029031E009BC708 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
8414AD241FCF5A1E00955102 /* TimelineHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineHeaderView.swift; sourceTree = "<group>"; };
|
||||
84162A142038C12C00035290 /* MarkCommandValidationStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkCommandValidationStatus.swift; sourceTree = "<group>"; };
|
||||
84162A242038C1E000035290 /* TimelineDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineDataSource.swift; sourceTree = "<group>"; };
|
||||
841ABA4D20145E7300980E11 /* NothingInspectorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NothingInspectorViewController.swift; sourceTree = "<group>"; };
|
||||
841ABA5D20145E9200980E11 /* FolderInspectorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FolderInspectorViewController.swift; sourceTree = "<group>"; };
|
||||
841ABA5F20145EC100980E11 /* BuiltinSmartFeedInspectorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuiltinSmartFeedInspectorViewController.swift; sourceTree = "<group>"; };
|
||||
841D4D542106B3D500DD04E6 /* Articles.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Articles.xcodeproj; path = Frameworks/Articles/Articles.xcodeproj; sourceTree = "<group>"; };
|
||||
841D4D5E2106B3E100DD04E6 /* ArticlesDatabase.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ArticlesDatabase.xcodeproj; path = Frameworks/ArticlesDatabase/ArticlesDatabase.xcodeproj; sourceTree = "<group>"; };
|
||||
842611891FCB67AA0086A189 /* FeedIconDownloader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedIconDownloader.swift; sourceTree = "<group>"; };
|
||||
8426119D1FCB6ED40086A189 /* HTMLMetadataDownloader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTMLMetadataDownloader.swift; sourceTree = "<group>"; };
|
||||
8426119F1FCB72600086A189 /* FeaturedImageDownloader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeaturedImageDownloader.swift; sourceTree = "<group>"; };
|
||||
@ -446,7 +559,6 @@
|
||||
845EE7B01FC2366500854A1F /* StarredFeedDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarredFeedDelegate.swift; sourceTree = "<group>"; };
|
||||
845EE7C01FC2488C00854A1F /* SmartFeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartFeed.swift; sourceTree = "<group>"; };
|
||||
845F52EC1FB2B9FC00C10BF0 /* FeedPasteboardWriter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedPasteboardWriter.swift; sourceTree = "<group>"; };
|
||||
846E77161F6EF5D000A165E2 /* Database.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Database.xcodeproj; path = Frameworks/Database/Database.xcodeproj; sourceTree = "<group>"; };
|
||||
846E77301F6EF5D600A165E2 /* Account.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Account.xcodeproj; path = Frameworks/Account/Account.xcodeproj; sourceTree = "<group>"; };
|
||||
84702AA31FA27AC0006B8943 /* MarkStatusCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkStatusCommand.swift; sourceTree = "<group>"; };
|
||||
8472058020142E8900AD578B /* FeedInspectorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedInspectorViewController.swift; sourceTree = "<group>"; };
|
||||
@ -514,17 +626,20 @@
|
||||
84AD1EA92031617300BC20B7 /* FolderPasteboardWriter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FolderPasteboardWriter.swift; sourceTree = "<group>"; };
|
||||
84AD1EB92031649C00BC20B7 /* SmartFeedPasteboardWriter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartFeedPasteboardWriter.swift; sourceTree = "<group>"; };
|
||||
84AD1EBB2032AF5C00BC20B7 /* SidebarOutlineDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarOutlineDataSource.swift; sourceTree = "<group>"; };
|
||||
84B06FC61ED37F7200F0B54B /* DB5.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = DB5.xcodeproj; path = Frameworks/DB5/DB5.xcodeproj; sourceTree = "<group>"; };
|
||||
84B06FE01ED3803200F0B54B /* RSFeedFinder.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSFeedFinder.xcodeproj; path = Frameworks/RSFeedFinder/RSFeedFinder.xcodeproj; sourceTree = "<group>"; };
|
||||
84B7178B201E66580091657D /* SidebarViewController+ContextualMenus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SidebarViewController+ContextualMenus.swift"; sourceTree = "<group>"; };
|
||||
84B99C661FAE35E600ECDEDB /* FeedListTreeControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListTreeControllerDelegate.swift; sourceTree = "<group>"; };
|
||||
84B99C681FAE36B800ECDEDB /* FeedListFolder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListFolder.swift; sourceTree = "<group>"; };
|
||||
84B99C6A1FAE370B00ECDEDB /* FeedListFeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListFeed.swift; sourceTree = "<group>"; };
|
||||
84B99C9C1FAE83C600ECDEDB /* DeleteFromSidebarCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteFromSidebarCommand.swift; sourceTree = "<group>"; };
|
||||
84BB4B611F1174D400858766 /* Data.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Data.xcodeproj; path = Frameworks/Data/Data.xcodeproj; sourceTree = "<group>"; };
|
||||
84BBB12B20142A4700F054F5 /* Inspector.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Inspector.storyboard; sourceTree = "<group>"; };
|
||||
84BBB12C20142A4700F054F5 /* InspectorWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InspectorWindowController.swift; sourceTree = "<group>"; };
|
||||
84C12A141FF5B0080009A267 /* FeedList.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = FeedList.storyboard; sourceTree = "<group>"; };
|
||||
84C37F2220DD8CCD00CA8CF5 /* DB5.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = DB5.xcodeproj; path = submodules/DB5/DB5.xcodeproj; sourceTree = "<group>"; };
|
||||
84C37F7A20DD8CF200CA8CF5 /* RSCore.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSCore.xcodeproj; path = submodules/RSCore/RSCore.xcodeproj; sourceTree = "<group>"; };
|
||||
84C37F8620DD8CF800CA8CF5 /* RSParser.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSParser.xcodeproj; path = submodules/RSParser/RSParser.xcodeproj; sourceTree = "<group>"; };
|
||||
84C37F8F20DD8CFD00CA8CF5 /* RSTree.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSTree.xcodeproj; path = submodules/RSTree/RSTree.xcodeproj; sourceTree = "<group>"; };
|
||||
84C37F9820DD8D0400CA8CF5 /* RSWeb.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSWeb.xcodeproj; path = submodules/RSWeb/RSWeb.xcodeproj; sourceTree = "<group>"; };
|
||||
84C37FB920DD8E0C00CA8CF5 /* RSDatabase.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSDatabase.xcodeproj; path = submodules/RSDatabase/RSDatabase.xcodeproj; sourceTree = "<group>"; };
|
||||
84CBDDAE1FD3674C005A61AA /* Technotes */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Technotes; sourceTree = "<group>"; };
|
||||
84CC08051FF5D2E000C0C0ED /* FeedListSplitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListSplitViewController.swift; sourceTree = "<group>"; };
|
||||
84CC88171FE59CBF00644329 /* SmartFeedsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartFeedsController.swift; sourceTree = "<group>"; };
|
||||
@ -546,6 +661,9 @@
|
||||
84F2D5351FC22FCB00998D64 /* PseudoFeed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PseudoFeed.swift; sourceTree = "<group>"; };
|
||||
84F2D5361FC22FCB00998D64 /* TodayFeedDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodayFeedDelegate.swift; sourceTree = "<group>"; };
|
||||
84F2D5391FC2308B00998D64 /* UnreadFeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnreadFeed.swift; sourceTree = "<group>"; };
|
||||
84F3EE0620DEC97E003FADEB /* FeedFinder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedFinder.swift; sourceTree = "<group>"; };
|
||||
84F3EE0720DEC97E003FADEB /* FeedSpecifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedSpecifier.swift; sourceTree = "<group>"; };
|
||||
84F3EE0820DEC97E003FADEB /* HTMLFeedFinder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTMLFeedFinder.swift; sourceTree = "<group>"; };
|
||||
84FB9A2D1EDCD6B8003D53B9 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = Frameworks/Vendor/Sparkle.framework; sourceTree = SOURCE_ROOT; };
|
||||
84FF69B01FC3793300DC198E /* FaviconURLFinder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaviconURLFinder.swift; sourceTree = "<group>"; };
|
||||
D553737C20186C1F006D8857 /* Article+Scriptability.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Article+Scriptability.swift"; sourceTree = "<group>"; };
|
||||
@ -620,12 +738,15 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
84BB4B771F11753300858766 /* Data.framework in Frameworks */,
|
||||
846E77411F6EF6A100A165E2 /* Database.framework in Frameworks */,
|
||||
84B06FE91ED3803A00F0B54B /* RSFeedFinder.framework in Frameworks */,
|
||||
84B06FCF1ED37F7D00F0B54B /* DB5.framework in Frameworks */,
|
||||
84C37FA920DD8D9000CA8CF5 /* RSWeb.framework in Frameworks */,
|
||||
84C37FC520DD8E1D00CA8CF5 /* RSDatabase.framework in Frameworks */,
|
||||
84C37FAD20DD8D9900CA8CF5 /* RSTree.framework in Frameworks */,
|
||||
84C37FB120DD8DA100CA8CF5 /* DB5.framework in Frameworks */,
|
||||
84C37FB520DD8DBB00CA8CF5 /* RSParser.framework in Frameworks */,
|
||||
846E773D1F6EF67A00A165E2 /* Account.framework in Frameworks */,
|
||||
84C37FA520DD8D8400CA8CF5 /* RSCore.framework in Frameworks */,
|
||||
84FB9A2F1EDCD6C4003D53B9 /* Sparkle.framework in Frameworks */,
|
||||
841D4D6B2106B3ED00DD04E6 /* Articles.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -685,6 +806,24 @@
|
||||
path = "Evergreen-iOSUITests";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
841D4D552106B3D500DD04E6 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
841D4D5B2106B3D600DD04E6 /* Articles.framework */,
|
||||
841D4D5D2106B3D600DD04E6 /* ArticlesTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
841D4D5F2106B3E100DD04E6 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
841D4D682106B3E100DD04E6 /* ArticlesDatabase.framework */,
|
||||
841D4D6A2106B3E100DD04E6 /* ArticlesDatabaseTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
8426119C1FCB6ED40086A189 /* HTMLMetadata */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -781,15 +920,6 @@
|
||||
path = Cell;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
846E77171F6EF5D000A165E2 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
846E77211F6EF5D100A165E2 /* Database.framework */,
|
||||
846E77231F6EF5D100A165E2 /* DatabaseTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
846E77311F6EF5D600A165E2 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -887,7 +1017,6 @@
|
||||
849A976A1ED9EBC8007D329B /* TimelineTableView.swift */,
|
||||
844B5B6C1FEA282400C7C76A /* Keyboard */,
|
||||
84E95D231FB1087500552D99 /* ArticlePasteboardWriter.swift */,
|
||||
8414AD241FCF5A1E00955102 /* TimelineHeaderView.swift */,
|
||||
84AAF2BE202CF684004A0BC4 /* TimelineContextualMenuDelegate.swift */,
|
||||
849A976F1ED9EC04007D329B /* Cell */,
|
||||
);
|
||||
@ -1005,6 +1134,7 @@
|
||||
8444C9011FED81880051386C /* Exporters */,
|
||||
84F2D5341FC22FCB00998D64 /* SmartFeeds */,
|
||||
849A97561ED9EB0D007D329B /* Data */,
|
||||
84F3EE0420DEC97E003FADEB /* FeedFinder */,
|
||||
8426119C1FCB6ED40086A189 /* HTMLMetadata */,
|
||||
848F6AE31FC29CFA002D422E /* Favicons */,
|
||||
845213211FCA5B10003B6E93 /* Images */,
|
||||
@ -1021,10 +1151,14 @@
|
||||
D5907CDA2002F084005947E5 /* xcconfig */,
|
||||
849C64611ED37A5D003D8FC0 /* Products */,
|
||||
846E77301F6EF5D600A165E2 /* Account.xcodeproj */,
|
||||
846E77161F6EF5D000A165E2 /* Database.xcodeproj */,
|
||||
84BB4B611F1174D400858766 /* Data.xcodeproj */,
|
||||
84B06FC61ED37F7200F0B54B /* DB5.xcodeproj */,
|
||||
84B06FE01ED3803200F0B54B /* RSFeedFinder.xcodeproj */,
|
||||
841D4D542106B3D500DD04E6 /* Articles.xcodeproj */,
|
||||
841D4D5E2106B3E100DD04E6 /* ArticlesDatabase.xcodeproj */,
|
||||
84C37F2220DD8CCD00CA8CF5 /* DB5.xcodeproj */,
|
||||
84C37F7A20DD8CF200CA8CF5 /* RSCore.xcodeproj */,
|
||||
84C37FB920DD8E0C00CA8CF5 /* RSDatabase.xcodeproj */,
|
||||
84C37F8620DD8CF800CA8CF5 /* RSParser.xcodeproj */,
|
||||
84C37F8F20DD8CFD00CA8CF5 /* RSTree.xcodeproj */,
|
||||
84C37F9820DD8D0400CA8CF5 /* RSWeb.xcodeproj */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@ -1070,33 +1204,6 @@
|
||||
path = Evergreen/Dinosaurs;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84B06FC71ED37F7200F0B54B /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84B06FCC1ED37F7200F0B54B /* DB5.framework */,
|
||||
84B06FCE1ED37F7200F0B54B /* DB5Tests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84B06FE11ED3803200F0B54B /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84B06FE61ED3803200F0B54B /* RSFeedFinder.framework */,
|
||||
84B06FE81ED3803200F0B54B /* RSFeedFinderTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84BB4B621F1174D400858766 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84BB4B681F1174D400858766 /* Data.framework */,
|
||||
84BB4B6A1F1174D400858766 /* DataTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84BBB12A20142A4700F054F5 /* Inspector */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -1111,6 +1218,63 @@
|
||||
path = Evergreen/Inspector;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84C37F2320DD8CCD00CA8CF5 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84C37F2820DD8CCE00CA8CF5 /* DB5.framework */,
|
||||
84C37F2A20DD8CCE00CA8CF5 /* DB5Tests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84C37F7B20DD8CF200CA8CF5 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84C37F8120DD8CF200CA8CF5 /* RSCore.framework */,
|
||||
84C37F8320DD8CF200CA8CF5 /* RSCoreTests.xctest */,
|
||||
84C37F8520DD8CF200CA8CF5 /* RSCore.framework */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84C37F8720DD8CF800CA8CF5 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84C37F8C20DD8CF800CA8CF5 /* RSParser.framework */,
|
||||
84C37F8E20DD8CF800CA8CF5 /* RSParserTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84C37F9020DD8CFD00CA8CF5 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84C37F9520DD8CFE00CA8CF5 /* RSTree.framework */,
|
||||
84C37F9720DD8CFE00CA8CF5 /* RSTreeTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84C37F9920DD8D0400CA8CF5 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84C37F9F20DD8D0500CA8CF5 /* RSWeb.framework */,
|
||||
84C37FA120DD8D0500CA8CF5 /* RSWebTests.xctest */,
|
||||
84C37FA320DD8D0500CA8CF5 /* RSWeb.framework */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84C37FBA20DD8E0C00CA8CF5 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84C37FC020DD8E0C00CA8CF5 /* RSDatabase.framework */,
|
||||
84C37FC220DD8E0C00CA8CF5 /* RSDatabaseTests.xctest */,
|
||||
84C37FC420DD8E0C00CA8CF5 /* RSDatabase.framework */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84DAEE201F86CAE00058304B /* Importers */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -1155,6 +1319,17 @@
|
||||
path = Evergreen/SmartFeeds;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84F3EE0420DEC97E003FADEB /* FeedFinder */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84F3EE0620DEC97E003FADEB /* FeedFinder.swift */,
|
||||
84F3EE0720DEC97E003FADEB /* FeedSpecifier.swift */,
|
||||
84F3EE0820DEC97E003FADEB /* HTMLFeedFinder.swift */,
|
||||
);
|
||||
name = FeedFinder;
|
||||
path = Evergreen/FeedFinder;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84FB9A2C1EDCD6A4003D53B9 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -1325,12 +1500,14 @@
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
84B06FD21ED37F7D00F0B54B /* PBXTargetDependency */,
|
||||
84B06FEC1ED3803A00F0B54B /* PBXTargetDependency */,
|
||||
84BB4B7A1F11753300858766 /* PBXTargetDependency */,
|
||||
846E77401F6EF67A00A165E2 /* PBXTargetDependency */,
|
||||
846E77441F6EF6A100A165E2 /* PBXTargetDependency */,
|
||||
6581C74520CED60100F4AD34 /* PBXTargetDependency */,
|
||||
84C37FA820DD8D8400CA8CF5 /* PBXTargetDependency */,
|
||||
84C37FAC20DD8D9000CA8CF5 /* PBXTargetDependency */,
|
||||
84C37FB020DD8D9900CA8CF5 /* PBXTargetDependency */,
|
||||
84C37FB420DD8DA100CA8CF5 /* PBXTargetDependency */,
|
||||
84C37FB820DD8DBB00CA8CF5 /* PBXTargetDependency */,
|
||||
84C37FC820DD8E1D00CA8CF5 /* PBXTargetDependency */,
|
||||
841D4D6E2106B3ED00DD04E6 /* PBXTargetDependency */,
|
||||
);
|
||||
name = Evergreen;
|
||||
productName = Evergreen;
|
||||
@ -1413,20 +1590,36 @@
|
||||
ProjectRef = 846E77301F6EF5D600A165E2 /* Account.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 84BB4B621F1174D400858766 /* Products */;
|
||||
ProjectRef = 84BB4B611F1174D400858766 /* Data.xcodeproj */;
|
||||
ProductGroup = 841D4D552106B3D500DD04E6 /* Products */;
|
||||
ProjectRef = 841D4D542106B3D500DD04E6 /* Articles.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 846E77171F6EF5D000A165E2 /* Products */;
|
||||
ProjectRef = 846E77161F6EF5D000A165E2 /* Database.xcodeproj */;
|
||||
ProductGroup = 841D4D5F2106B3E100DD04E6 /* Products */;
|
||||
ProjectRef = 841D4D5E2106B3E100DD04E6 /* ArticlesDatabase.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 84B06FC71ED37F7200F0B54B /* Products */;
|
||||
ProjectRef = 84B06FC61ED37F7200F0B54B /* DB5.xcodeproj */;
|
||||
ProductGroup = 84C37F2320DD8CCD00CA8CF5 /* Products */;
|
||||
ProjectRef = 84C37F2220DD8CCD00CA8CF5 /* DB5.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 84B06FE11ED3803200F0B54B /* Products */;
|
||||
ProjectRef = 84B06FE01ED3803200F0B54B /* RSFeedFinder.xcodeproj */;
|
||||
ProductGroup = 84C37F7B20DD8CF200CA8CF5 /* Products */;
|
||||
ProjectRef = 84C37F7A20DD8CF200CA8CF5 /* RSCore.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 84C37FBA20DD8E0C00CA8CF5 /* Products */;
|
||||
ProjectRef = 84C37FB920DD8E0C00CA8CF5 /* RSDatabase.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 84C37F8720DD8CF800CA8CF5 /* Products */;
|
||||
ProjectRef = 84C37F8620DD8CF800CA8CF5 /* RSParser.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 84C37F9020DD8CFD00CA8CF5 /* Products */;
|
||||
ProjectRef = 84C37F8F20DD8CFD00CA8CF5 /* RSTree.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 84C37F9920DD8D0400CA8CF5 /* Products */;
|
||||
ProjectRef = 84C37F9820DD8D0400CA8CF5 /* RSWeb.xcodeproj */;
|
||||
},
|
||||
);
|
||||
projectRoot = "";
|
||||
@ -1442,18 +1635,32 @@
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXReferenceProxy section */
|
||||
846E77211F6EF5D100A165E2 /* Database.framework */ = {
|
||||
841D4D5B2106B3D600DD04E6 /* Articles.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = Database.framework;
|
||||
remoteRef = 846E77201F6EF5D100A165E2 /* PBXContainerItemProxy */;
|
||||
path = Articles.framework;
|
||||
remoteRef = 841D4D5A2106B3D600DD04E6 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
846E77231F6EF5D100A165E2 /* DatabaseTests.xctest */ = {
|
||||
841D4D5D2106B3D600DD04E6 /* ArticlesTests.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = DatabaseTests.xctest;
|
||||
remoteRef = 846E77221F6EF5D100A165E2 /* PBXContainerItemProxy */;
|
||||
path = ArticlesTests.xctest;
|
||||
remoteRef = 841D4D5C2106B3D600DD04E6 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
841D4D682106B3E100DD04E6 /* ArticlesDatabase.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = ArticlesDatabase.framework;
|
||||
remoteRef = 841D4D672106B3E100DD04E6 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
841D4D6A2106B3E100DD04E6 /* ArticlesDatabaseTests.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = ArticlesDatabaseTests.xctest;
|
||||
remoteRef = 841D4D692106B3E100DD04E6 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
846E773A1F6EF5D700A165E2 /* Account.framework */ = {
|
||||
@ -1470,46 +1677,109 @@
|
||||
remoteRef = 846E773B1F6EF5D700A165E2 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84B06FCC1ED37F7200F0B54B /* DB5.framework */ = {
|
||||
84C37F2820DD8CCE00CA8CF5 /* DB5.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = DB5.framework;
|
||||
remoteRef = 84B06FCB1ED37F7200F0B54B /* PBXContainerItemProxy */;
|
||||
remoteRef = 84C37F2720DD8CCE00CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84B06FCE1ED37F7200F0B54B /* DB5Tests.xctest */ = {
|
||||
84C37F2A20DD8CCE00CA8CF5 /* DB5Tests.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = DB5Tests.xctest;
|
||||
remoteRef = 84B06FCD1ED37F7200F0B54B /* PBXContainerItemProxy */;
|
||||
remoteRef = 84C37F2920DD8CCE00CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84B06FE61ED3803200F0B54B /* RSFeedFinder.framework */ = {
|
||||
84C37F8120DD8CF200CA8CF5 /* RSCore.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = RSFeedFinder.framework;
|
||||
remoteRef = 84B06FE51ED3803200F0B54B /* PBXContainerItemProxy */;
|
||||
path = RSCore.framework;
|
||||
remoteRef = 84C37F8020DD8CF200CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84B06FE81ED3803200F0B54B /* RSFeedFinderTests.xctest */ = {
|
||||
84C37F8320DD8CF200CA8CF5 /* RSCoreTests.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = RSFeedFinderTests.xctest;
|
||||
remoteRef = 84B06FE71ED3803200F0B54B /* PBXContainerItemProxy */;
|
||||
path = RSCoreTests.xctest;
|
||||
remoteRef = 84C37F8220DD8CF200CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84BB4B681F1174D400858766 /* Data.framework */ = {
|
||||
84C37F8520DD8CF200CA8CF5 /* RSCore.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = Data.framework;
|
||||
remoteRef = 84BB4B671F1174D400858766 /* PBXContainerItemProxy */;
|
||||
path = RSCore.framework;
|
||||
remoteRef = 84C37F8420DD8CF200CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84BB4B6A1F1174D400858766 /* DataTests.xctest */ = {
|
||||
84C37F8C20DD8CF800CA8CF5 /* RSParser.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = RSParser.framework;
|
||||
remoteRef = 84C37F8B20DD8CF800CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84C37F8E20DD8CF800CA8CF5 /* RSParserTests.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = DataTests.xctest;
|
||||
remoteRef = 84BB4B691F1174D400858766 /* PBXContainerItemProxy */;
|
||||
path = RSParserTests.xctest;
|
||||
remoteRef = 84C37F8D20DD8CF800CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84C37F9520DD8CFE00CA8CF5 /* RSTree.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = RSTree.framework;
|
||||
remoteRef = 84C37F9420DD8CFE00CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84C37F9720DD8CFE00CA8CF5 /* RSTreeTests.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = RSTreeTests.xctest;
|
||||
remoteRef = 84C37F9620DD8CFE00CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84C37F9F20DD8D0500CA8CF5 /* RSWeb.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = RSWeb.framework;
|
||||
remoteRef = 84C37F9E20DD8D0500CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84C37FA120DD8D0500CA8CF5 /* RSWebTests.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = RSWebTests.xctest;
|
||||
remoteRef = 84C37FA020DD8D0500CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84C37FA320DD8D0500CA8CF5 /* RSWeb.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = RSWeb.framework;
|
||||
remoteRef = 84C37FA220DD8D0500CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84C37FC020DD8E0C00CA8CF5 /* RSDatabase.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = RSDatabase.framework;
|
||||
remoteRef = 84C37FBF20DD8E0C00CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84C37FC220DD8E0C00CA8CF5 /* RSDatabaseTests.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = RSDatabaseTests.xctest;
|
||||
remoteRef = 84C37FC120DD8E0C00CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
84C37FC420DD8E0C00CA8CF5 /* RSDatabase.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = RSDatabase.framework;
|
||||
remoteRef = 84C37FC320DD8E0C00CA8CF5 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
/* End PBXReferenceProxy section */
|
||||
@ -1618,6 +1888,9 @@
|
||||
840D61832029031C009BC708 /* DetailViewController.swift in Sources */,
|
||||
840D61812029031C009BC708 /* MasterViewController.swift in Sources */,
|
||||
840D617F2029031C009BC708 /* AppDelegate.swift in Sources */,
|
||||
84F3EE1720DEC97E003FADEB /* FeedFinder.swift in Sources */,
|
||||
84F3EE1B20DEC97E003FADEB /* HTMLFeedFinder.swift in Sources */,
|
||||
84F3EE1920DEC97E003FADEB /* FeedSpecifier.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -1698,8 +1971,10 @@
|
||||
84F204CE1FAACB660076E152 /* FeedListViewController.swift in Sources */,
|
||||
84AD1EBC2032AF5C00BC20B7 /* SidebarOutlineDataSource.swift in Sources */,
|
||||
845A29241FC9255E007B49E3 /* SidebarCellAppearance.swift in Sources */,
|
||||
84F3EE1620DEC97E003FADEB /* FeedFinder.swift in Sources */,
|
||||
845EE7B11FC2366500854A1F /* StarredFeedDelegate.swift in Sources */,
|
||||
848F6AE51FC29CFB002D422E /* FaviconDownloader.swift in Sources */,
|
||||
84F3EE1820DEC97E003FADEB /* FeedSpecifier.swift in Sources */,
|
||||
849EE72120391F560082A1EA /* MainWindowSharingServicePickerDelegate.swift in Sources */,
|
||||
849A97981ED9EFAA007D329B /* Node-Extensions.swift in Sources */,
|
||||
849EE70F203919360082A1EA /* AppImages.swift in Sources */,
|
||||
@ -1721,6 +1996,7 @@
|
||||
841ABA6020145EC100980E11 /* BuiltinSmartFeedInspectorViewController.swift in Sources */,
|
||||
D5E4CC54202C1361009B4FFC /* AppDelegate+Scriptability.swift in Sources */,
|
||||
D5F4EDB5200744A700B9E363 /* ScriptingObject.swift in Sources */,
|
||||
84F3EE1A20DEC97E003FADEB /* HTMLFeedFinder.swift in Sources */,
|
||||
D5F4EDB920074D7C00B9E363 /* Folder+Scriptability.swift in Sources */,
|
||||
842611A01FCB72600086A189 /* FeaturedImageDownloader.swift in Sources */,
|
||||
849A97781ED9EC04007D329B /* TimelineCellLayout.swift in Sources */,
|
||||
@ -1745,7 +2021,6 @@
|
||||
D5F4EDB720074D6500B9E363 /* Feed+Scriptability.swift in Sources */,
|
||||
84E850861FCB60CE0072EA88 /* AuthorAvatarDownloader.swift in Sources */,
|
||||
84E185B3203B74E500F69BFA /* SingleLineTextFieldSizer.swift in Sources */,
|
||||
8414AD251FCF5A1E00955102 /* TimelineHeaderView.swift in Sources */,
|
||||
849EE71F20391DF20082A1EA /* MainWindowToolbarDelegate.swift in Sources */,
|
||||
849A977A1ED9EC04007D329B /* TimelineTableCellView.swift in Sources */,
|
||||
849A97761ED9EC04007D329B /* TimelineCellAppearance.swift in Sources */,
|
||||
@ -1797,35 +2072,50 @@
|
||||
target = 840D617B2029031C009BC708 /* Evergreen-iOS */;
|
||||
targetProxy = 840D619D2029031E009BC708 /* PBXContainerItemProxy */;
|
||||
};
|
||||
841D4D6E2106B3ED00DD04E6 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = Articles;
|
||||
targetProxy = 841D4D6D2106B3ED00DD04E6 /* PBXContainerItemProxy */;
|
||||
};
|
||||
846E77401F6EF67A00A165E2 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = Account;
|
||||
targetProxy = 846E773F1F6EF67A00A165E2 /* PBXContainerItemProxy */;
|
||||
};
|
||||
846E77441F6EF6A100A165E2 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = Database;
|
||||
targetProxy = 846E77431F6EF6A100A165E2 /* PBXContainerItemProxy */;
|
||||
};
|
||||
849C64731ED37A5D003D8FC0 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 849C645F1ED37A5D003D8FC0 /* Evergreen */;
|
||||
targetProxy = 849C64721ED37A5D003D8FC0 /* PBXContainerItemProxy */;
|
||||
};
|
||||
84B06FD21ED37F7D00F0B54B /* PBXTargetDependency */ = {
|
||||
84C37FA820DD8D8400CA8CF5 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = RSCore;
|
||||
targetProxy = 84C37FA720DD8D8400CA8CF5 /* PBXContainerItemProxy */;
|
||||
};
|
||||
84C37FAC20DD8D9000CA8CF5 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = RSWeb;
|
||||
targetProxy = 84C37FAB20DD8D9000CA8CF5 /* PBXContainerItemProxy */;
|
||||
};
|
||||
84C37FB020DD8D9900CA8CF5 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = RSTree;
|
||||
targetProxy = 84C37FAF20DD8D9900CA8CF5 /* PBXContainerItemProxy */;
|
||||
};
|
||||
84C37FB420DD8DA100CA8CF5 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = DB5;
|
||||
targetProxy = 84B06FD11ED37F7D00F0B54B /* PBXContainerItemProxy */;
|
||||
targetProxy = 84C37FB320DD8DA100CA8CF5 /* PBXContainerItemProxy */;
|
||||
};
|
||||
84B06FEC1ED3803A00F0B54B /* PBXTargetDependency */ = {
|
||||
84C37FB820DD8DBB00CA8CF5 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = RSFeedFinder;
|
||||
targetProxy = 84B06FEB1ED3803A00F0B54B /* PBXContainerItemProxy */;
|
||||
name = RSParser;
|
||||
targetProxy = 84C37FB720DD8DBB00CA8CF5 /* PBXContainerItemProxy */;
|
||||
};
|
||||
84BB4B7A1F11753300858766 /* PBXTargetDependency */ = {
|
||||
84C37FC820DD8E1D00CA8CF5 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = Data;
|
||||
targetProxy = 84BB4B791F11753300858766 /* PBXContainerItemProxy */;
|
||||
name = RSDatabase;
|
||||
targetProxy = 84C37FC720DD8E1D00CA8CF5 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
@ -2357,6 +2647,8 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D5907CE02002F0FA005947E5 /* Evergreen_target.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
@ -2364,6 +2656,8 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D5907CE02002F0FA005947E5 /* Evergreen_target.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import AppKit
|
||||
import DB5
|
||||
import Data
|
||||
import Articles
|
||||
import RSTree
|
||||
import RSWeb
|
||||
import Account
|
||||
@ -104,7 +104,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations,
|
||||
|
||||
func applicationDidFinishLaunching(_ note: Notification) {
|
||||
|
||||
appName = Bundle.main.infoDictionary!["CFBundleExecutable"]! as! String
|
||||
appName = (Bundle.main.infoDictionary!["CFBundleExecutable"]! as! String)
|
||||
|
||||
let isFirstRun = AppDefaults.shared.isFirstRun
|
||||
if isFirstRun {
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
extension Notification.Name {
|
||||
|
||||
|
@ -1,17 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="14092" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="14295.6" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14092"/>
|
||||
<capability name="box content view" minToolsVersion="7.0"/>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14295.6"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
<capability name="system font weights other than Regular or Bold" minToolsVersion="7.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Window Controller-->
|
||||
<scene sceneID="R2V-B0-nI4">
|
||||
<objects>
|
||||
<windowController id="B8D-0N-5wS" customClass="MainWindowController" customModule="Evergreen" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<window key="window" title="Evergreen" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="IQv-IB-iLA">
|
||||
<window key="window" title="Evergreen" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="IQv-IB-iLA">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
||||
<windowCollectionBehavior key="collectionBehavior" fullScreenPrimary="YES"/>
|
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||
@ -211,7 +210,7 @@
|
||||
<splitViewItem holdingPriority="255" behavior="contentList" id="UkR-qu-7uT"/>
|
||||
<splitViewItem id="EtR-h8-kPm"/>
|
||||
</splitViewItems>
|
||||
<splitView key="splitView" wantsLayer="YES" appearanceType="aqua" dividerStyle="thin" vertical="YES" id="3QF-bA-qOw" customClass="MainWindowSplitView" customModule="Evergreen" customModuleProvider="target">
|
||||
<splitView key="splitView" wantsLayer="YES" dividerStyle="thin" vertical="YES" id="3QF-bA-qOw">
|
||||
<rect key="frame" x="0.0" y="0.0" width="450" height="300"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<connections>
|
||||
@ -237,13 +236,8 @@
|
||||
<rect key="frame" x="0.0" y="0.0" width="581" height="300"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<containerView appearanceType="aqua" translatesAutoresizingMaskIntoConstraints="NO" id="K1o-Ws-XMQ">
|
||||
<containerView translatesAutoresizingMaskIntoConstraints="NO" id="K1o-Ws-XMQ">
|
||||
<rect key="frame" x="0.0" y="0.0" width="581" height="300"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="backgroundColor">
|
||||
<color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<segue destination="wEf-EP-9Fq" kind="embed" id="IT3-aj-bSe"/>
|
||||
</connections>
|
||||
@ -265,24 +259,24 @@
|
||||
<scene sceneID="Yae-mu-VsH">
|
||||
<objects>
|
||||
<viewController id="XML-A3-pDn" userLabel="Sidebar View Controller" customClass="SidebarViewController" customModule="Evergreen" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" appearanceType="aqua" id="bJZ-bH-vgc">
|
||||
<view key="view" id="bJZ-bH-vgc">
|
||||
<rect key="frame" x="0.0" y="0.0" width="166" height="300"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<scrollView appearanceType="aqua" borderType="none" autohidesScrollers="YES" horizontalLineScroll="26" horizontalPageScroll="10" verticalLineScroll="26" verticalPageScroll="10" hasHorizontalScroller="NO" horizontalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="cJj-Wv-9ep">
|
||||
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="24" horizontalPageScroll="10" verticalLineScroll="24" verticalPageScroll="10" hasHorizontalScroller="NO" horizontalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="cJj-Wv-9ep">
|
||||
<rect key="frame" x="0.0" y="28" width="166" height="272"/>
|
||||
<clipView key="contentView" id="2eU-Wz-F9g">
|
||||
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="2eU-Wz-F9g">
|
||||
<rect key="frame" x="0.0" y="0.0" width="166" height="272"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<outlineView appearanceType="aqua" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="firstColumnOnly" selectionHighlightStyle="sourceList" columnReordering="NO" columnResizing="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="24" rowSizeStyle="medium" viewBased="YES" floatsGroupRows="NO" indentationPerLevel="23" outlineTableColumn="ih9-mJ-EA7" id="cnV-kg-Dn2" customClass="SidebarOutlineView" customModule="Evergreen" customModuleProvider="target">
|
||||
<outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="firstColumnOnly" selectionHighlightStyle="sourceList" columnReordering="NO" columnResizing="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="24" rowSizeStyle="medium" viewBased="YES" floatsGroupRows="NO" indentationPerLevel="14" outlineTableColumn="ih9-mJ-EA7" id="cnV-kg-Dn2" customClass="SidebarOutlineView" customModule="Evergreen" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="167" height="272"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<size key="intercellSpacing" width="3" height="2"/>
|
||||
<color key="backgroundColor" white="0.95999999999999996" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="intercellSpacing" width="3" height="0.0"/>
|
||||
<color key="backgroundColor" name="_sourceListBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<tableColumns>
|
||||
<tableColumn identifier="" width="164" minWidth="16" maxWidth="1000" id="ih9-mJ-EA7">
|
||||
<tableColumn width="164" minWidth="16" maxWidth="1000" id="ih9-mJ-EA7">
|
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||
@ -296,7 +290,7 @@
|
||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView identifier="HeaderCell" id="qkt-WA-5tB">
|
||||
<rect key="frame" x="1" y="1" width="164" height="17"/>
|
||||
<rect key="frame" x="1" y="0.0" width="164" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fNJ-z1-0Up">
|
||||
@ -314,7 +308,7 @@
|
||||
</connections>
|
||||
</tableCellView>
|
||||
<tableCellView identifier="DataCell" id="HJn-Tm-YNO" customClass="SidebarCell" customModule="Evergreen" customModuleProvider="target">
|
||||
<rect key="frame" x="1" y="20" width="164" height="17"/>
|
||||
<rect key="frame" x="1" y="17" width="164" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<imageView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ocU-b4-EaY">
|
||||
@ -352,20 +346,20 @@
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="150" id="pzy-wh-tgi"/>
|
||||
</constraints>
|
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="vs5-5h-CXe">
|
||||
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="vs5-5h-CXe">
|
||||
<rect key="frame" x="-100" y="-100" width="238" height="15"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="FWV-kB-qct">
|
||||
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="FWV-kB-qct">
|
||||
<rect key="frame" x="224" y="17" width="15" height="102"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
</scrollView>
|
||||
<customView appearanceType="aqua" translatesAutoresizingMaskIntoConstraints="NO" id="HZs-Zf-G8s" customClass="SidebarStatusBarView" customModule="Evergreen" customModuleProvider="target">
|
||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="HZs-Zf-G8s" customClass="SidebarStatusBarView" customModule="Evergreen" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="166" height="28"/>
|
||||
<subviews>
|
||||
<popUpButton translatesAutoresizingMaskIntoConstraints="NO" id="gZE-LB-FdW">
|
||||
<rect key="frame" x="8" y="4" width="40" height="19"/>
|
||||
<rect key="frame" x="8" y="5" width="40" height="19"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="40" id="7UB-w9-Vc2"/>
|
||||
</constraints>
|
||||
@ -391,7 +385,7 @@
|
||||
</constraints>
|
||||
</progressIndicator>
|
||||
<textField hidden="YES" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="iyL-pW-cT6">
|
||||
<rect key="frame" x="98" y="6" width="62" height="17"/>
|
||||
<rect key="frame" x="98" y="5" width="62" height="18"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Label" id="dVE-XG-mlU">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
|
||||
@ -474,81 +468,19 @@
|
||||
<rect key="frame" x="0.0" y="0.0" width="450" height="198"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<customView hidden="YES" translatesAutoresizingMaskIntoConstraints="NO" id="rE6-fd-xjY" customClass="TimelineHeaderView" customModule="Evergreen" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="166" width="450" height="32"/>
|
||||
<subviews>
|
||||
<visualEffectView wantsLayer="YES" appearanceType="vibrantLight" blendingMode="withinWindow" material="appearanceBased" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="KZz-oC-IY4">
|
||||
<rect key="frame" x="0.0" y="0.0" width="450" height="32"/>
|
||||
<subviews>
|
||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Htn-9a-fHq">
|
||||
<rect key="frame" x="8" y="8" width="16" height="16"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="16" id="JvG-d1-oHx"/>
|
||||
<constraint firstAttribute="width" constant="16" id="YXX-OZ-bYj"/>
|
||||
</constraints>
|
||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSMobileMe" id="fKm-v3-gvk"/>
|
||||
</imageView>
|
||||
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="OEi-dC-LVf">
|
||||
<rect key="frame" x="0.0" y="-2" width="450" height="5"/>
|
||||
</box>
|
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Xi3-Wb-g8i">
|
||||
<rect key="frame" x="30" y="8" width="141" height="17"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Feed Name Goes Here" usesSingleLineMode="YES" id="rUx-Cw-Etb">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<popUpButton horizontalHuggingPriority="1000" horizontalCompressionResistancePriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="nD3-Ps-HWV">
|
||||
<rect key="frame" x="317" y="6" width="113" height="21"/>
|
||||
<popUpButtonCell key="cell" type="bevel" title="Newest at Top" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" imageScaling="proportionallyDown" inset="2" selectedItem="Va5-4d-T8y" id="4y3-td-JFr">
|
||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="menu"/>
|
||||
<menu key="menu" id="OsY-jU-uaW">
|
||||
<items>
|
||||
<menuItem title="Newest at Top" state="on" id="Va5-4d-T8y"/>
|
||||
<menuItem title="Oldest at Top" id="mQo-Qa-Tpy"/>
|
||||
</items>
|
||||
</menu>
|
||||
</popUpButtonCell>
|
||||
</popUpButton>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="OEi-dC-LVf" firstAttribute="leading" secondItem="KZz-oC-IY4" secondAttribute="leading" id="1Oo-pn-y0p"/>
|
||||
<constraint firstItem="nD3-Ps-HWV" firstAttribute="centerY" secondItem="KZz-oC-IY4" secondAttribute="centerY" id="4zl-gZ-IHd"/>
|
||||
<constraint firstAttribute="bottom" secondItem="OEi-dC-LVf" secondAttribute="bottom" id="PWd-tI-hJv"/>
|
||||
<constraint firstAttribute="trailing" secondItem="OEi-dC-LVf" secondAttribute="trailing" id="Tn9-sO-xyf"/>
|
||||
<constraint firstAttribute="trailing" secondItem="nD3-Ps-HWV" secondAttribute="trailing" constant="20" symbolic="YES" id="UML-wO-FtR"/>
|
||||
<constraint firstItem="nD3-Ps-HWV" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Xi3-Wb-g8i" secondAttribute="trailing" constant="8" symbolic="YES" id="c2Q-gZ-09I"/>
|
||||
<constraint firstItem="Htn-9a-fHq" firstAttribute="centerY" secondItem="KZz-oC-IY4" secondAttribute="centerY" id="exW-Wb-cFV"/>
|
||||
<constraint firstItem="Xi3-Wb-g8i" firstAttribute="centerY" secondItem="KZz-oC-IY4" secondAttribute="centerY" id="hBe-H5-BTq"/>
|
||||
<constraint firstItem="Htn-9a-fHq" firstAttribute="leading" secondItem="KZz-oC-IY4" secondAttribute="leading" constant="8" id="uNw-GL-NKl"/>
|
||||
<constraint firstItem="Xi3-Wb-g8i" firstAttribute="leading" secondItem="Htn-9a-fHq" secondAttribute="trailing" constant="8" symbolic="YES" id="wUi-1g-qPE"/>
|
||||
</constraints>
|
||||
</visualEffectView>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="KZz-oC-IY4" firstAttribute="top" secondItem="rE6-fd-xjY" secondAttribute="top" id="DHX-DN-tYv"/>
|
||||
<constraint firstAttribute="height" constant="32" id="IS4-45-UCw"/>
|
||||
<constraint firstAttribute="trailing" secondItem="KZz-oC-IY4" secondAttribute="trailing" id="K5w-RS-gmv"/>
|
||||
<constraint firstAttribute="bottom" secondItem="KZz-oC-IY4" secondAttribute="bottom" id="Qdt-ZH-ygb"/>
|
||||
<constraint firstItem="KZz-oC-IY4" firstAttribute="leading" secondItem="rE6-fd-xjY" secondAttribute="leading" id="dqI-OO-8A0"/>
|
||||
</constraints>
|
||||
</customView>
|
||||
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="97" horizontalPageScroll="10" verticalLineScroll="97" verticalPageScroll="10" hasHorizontalScroller="NO" horizontalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="Kfs-n2-RYk">
|
||||
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="96" horizontalPageScroll="10" verticalLineScroll="96" verticalPageScroll="10" hasHorizontalScroller="NO" horizontalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="Kfs-n2-RYk">
|
||||
<rect key="frame" x="0.0" y="0.0" width="450" height="198"/>
|
||||
<clipView key="contentView" copiesOnScroll="NO" id="yAN-Ex-RC7">
|
||||
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="yAN-Ex-RC7">
|
||||
<rect key="frame" x="0.0" y="0.0" width="450" height="198"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="96" viewBased="YES" id="DRs-j8-R9a" customClass="TimelineTableView" customModule="Evergreen" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="450" height="198"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<size key="intercellSpacing" width="0.0" height="1"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
<color key="gridColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<tableColumns>
|
||||
<tableColumn identifier="" width="447" minWidth="40" maxWidth="1000" id="5h5-G1-xGq">
|
||||
<tableColumn width="447" minWidth="40" maxWidth="1000" id="5h5-G1-xGq">
|
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||
@ -566,7 +498,7 @@
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
</tableCellView>
|
||||
<customView identifier="timelineRow" id="54E-Vz-WND" customClass="TimelineTableRowView" customModule="Evergreen" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="69" width="447" height="96"/>
|
||||
<rect key="frame" x="0.0" y="68" width="447" height="96"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
</customView>
|
||||
</prototypeCellViews>
|
||||
@ -580,32 +512,24 @@
|
||||
</connections>
|
||||
</tableView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
<nil key="backgroundColor"/>
|
||||
</clipView>
|
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="9r2-h4-K46">
|
||||
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="9r2-h4-K46">
|
||||
<rect key="frame" x="-100" y="-100" width="223" height="15"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="hSI-DO-hVu">
|
||||
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="hSI-DO-hVu">
|
||||
<rect key="frame" x="224" y="17" width="15" height="102"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
</scrollView>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="rE6-fd-xjY" firstAttribute="leading" secondItem="Dnl-L5-xFP" secondAttribute="leading" id="D3E-uE-bLp"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Kfs-n2-RYk" secondAttribute="trailing" id="F6K-ec-Sge"/>
|
||||
<constraint firstItem="Kfs-n2-RYk" firstAttribute="leading" secondItem="Dnl-L5-xFP" secondAttribute="leading" id="Leg-dK-IeP"/>
|
||||
<constraint firstAttribute="trailing" secondItem="rE6-fd-xjY" secondAttribute="trailing" id="Om9-UK-QCw"/>
|
||||
<constraint firstAttribute="bottom" secondItem="Kfs-n2-RYk" secondAttribute="bottom" id="Xc2-9H-WP5"/>
|
||||
<constraint firstItem="rE6-fd-xjY" firstAttribute="top" secondItem="Dnl-L5-xFP" secondAttribute="top" id="g26-bB-vjf"/>
|
||||
<constraint firstItem="Kfs-n2-RYk" firstAttribute="top" secondItem="Dnl-L5-xFP" secondAttribute="top" id="hdo-Qf-B6h"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="backgroundColor">
|
||||
<color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="contextualMenuDelegate" destination="iD1-KK-gFc" id="b0j-aW-e4B"/>
|
||||
@ -683,11 +607,6 @@
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="xI5-lx-RD8" secondAttribute="trailing" constant="6" id="pbD-LN-Gk1"/>
|
||||
<constraint firstAttribute="bottom" secondItem="xI5-lx-RD8" secondAttribute="bottom" constant="2" id="zsv-B0-ChW"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="backgroundColor">
|
||||
<color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<outlet property="detailStatusBarView" destination="xI5-lx-RD8" id="yIZ-aP-fKF"/>
|
||||
</connections>
|
||||
@ -741,7 +660,7 @@
|
||||
</constraints>
|
||||
</view>
|
||||
<color key="borderColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<color key="fillColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<color key="fillColor" name="underPageBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</box>
|
||||
</subviews>
|
||||
<constraints>
|
||||
@ -761,7 +680,6 @@
|
||||
</scenes>
|
||||
<resources>
|
||||
<image name="NSAddTemplate" width="11" height="11"/>
|
||||
<image name="NSMobileMe" width="32" height="32"/>
|
||||
<image name="NSRefreshTemplate" width="11" height="15"/>
|
||||
<image name="NSShareTemplate" width="11" height="16"/>
|
||||
<image name="action" width="9.5" height="9.5"/>
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
|
||||
// These handle multiple accounts.
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
|
||||
protocol SmallIconProvider {
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import RSTree
|
||||
import Data
|
||||
import Articles
|
||||
import RSCore
|
||||
|
||||
extension Array where Element == Node {
|
||||
|
@ -7,7 +7,8 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
import RSCore
|
||||
|
||||
extension Notification.Name {
|
||||
|
@ -1,6 +1,6 @@
|
||||
//
|
||||
// FeedFinder.swift
|
||||
// RSFeedFinder
|
||||
// FeedFinder
|
||||
//
|
||||
// Created by Brent Simmons on 8/2/16.
|
||||
// Copyright © 2016 Ranchero Software, LLC. All rights reserved.
|
@ -1,6 +1,6 @@
|
||||
//
|
||||
// FeedSpecifier.swift
|
||||
// RSFeedFinder
|
||||
// FeedFinder
|
||||
//
|
||||
// Created by Brent Simmons on 8/7/16.
|
||||
// Copyright © 2016 Ranchero Software, LLC. All rights reserved.
|
@ -1,6 +1,6 @@
|
||||
//
|
||||
// HTMLFeedFinder.swift
|
||||
// RSFeedFinder
|
||||
// FeedFinder
|
||||
//
|
||||
// Created by Brent Simmons on 8/7/16.
|
||||
// Copyright © 2016 Ranchero Software, LLC. All rights reserved.
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import RSCore
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
final class FeedListFolder: Hashable, DisplayNameProvider {
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
extension Notification.Name {
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
import RSParser
|
||||
|
||||
final class FeaturedImageDownloader {
|
||||
|
@ -7,7 +7,8 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
import RSWeb
|
||||
import RSParser
|
||||
|
||||
|
@ -7,7 +7,8 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
import DB5
|
||||
|
||||
final class FeedInspectorViewController: NSViewController, Inspector {
|
||||
|
@ -9,8 +9,7 @@
|
||||
import AppKit
|
||||
import RSCore
|
||||
import RSTree
|
||||
import Data
|
||||
import RSFeedFinder
|
||||
import Articles
|
||||
import Account
|
||||
import RSParser
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
import AppKit
|
||||
import RSCore
|
||||
import RSTree
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
|
||||
protocol AddFeedWindowControllerDelegate: class {
|
||||
|
@ -9,7 +9,7 @@
|
||||
import Foundation
|
||||
import RSCore
|
||||
import RSTree
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
|
||||
final class FolderTreeControllerDelegate: TreeControllerDelegate {
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
|
||||
class AddFolderWindowController : NSWindowController {
|
||||
|
@ -8,7 +8,8 @@
|
||||
|
||||
import Foundation
|
||||
import RSCore
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
|
||||
var cachedStyleString = ""
|
||||
var cachedTemplate = ""
|
||||
@ -453,7 +454,7 @@ class ArticleRenderer {
|
||||
|
||||
"""
|
||||
|
||||
s += "\n\n</head><body onload='startup()'>\n\n"
|
||||
s += "\n\n</head><body onload='startup()' class=dark>\n\n"
|
||||
|
||||
|
||||
s += RSMacroProcessor.renderedText(withTemplate: template(), substitutions: substitutions(), macroStart: "[[", macroEnd: "]]")
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import AppKit
|
||||
import DB5
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
final class DetailStatusBarView: NSView {
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
import Foundation
|
||||
import WebKit
|
||||
import RSCore
|
||||
import Data
|
||||
import Articles
|
||||
import RSWeb
|
||||
|
||||
final class DetailViewController: NSViewController, WKUIDelegate {
|
||||
@ -249,11 +249,11 @@ final class DetailContainerView: NSView {
|
||||
|
||||
weak var viewController: DetailViewController? = nil
|
||||
|
||||
private var didConfigureLayer = false
|
||||
|
||||
override var wantsUpdateLayer: Bool {
|
||||
return true
|
||||
}
|
||||
// private var didConfigureLayer = false
|
||||
//
|
||||
// override var wantsUpdateLayer: Bool {
|
||||
// return true
|
||||
// }
|
||||
|
||||
var contentView: NSView? {
|
||||
didSet {
|
||||
@ -278,17 +278,21 @@ final class DetailContainerView: NSView {
|
||||
viewController?.viewDidEndLiveResize()
|
||||
}
|
||||
|
||||
override func updateLayer() {
|
||||
|
||||
guard !didConfigureLayer else {
|
||||
return
|
||||
}
|
||||
if let layer = layer {
|
||||
let color = appDelegate.currentTheme.color(forKey: "MainWindow.Detail.backgroundColor")
|
||||
layer.backgroundColor = color.cgColor
|
||||
didConfigureLayer = true
|
||||
}
|
||||
override func draw(_ dirtyRect: NSRect) {
|
||||
NSColor.textBackgroundColor.setFill()
|
||||
dirtyRect.fill()
|
||||
}
|
||||
// override func updateLayer() {
|
||||
//
|
||||
// guard !didConfigureLayer else {
|
||||
// return
|
||||
// }
|
||||
// if let layer = layer {
|
||||
// let color = appDelegate.currentTheme.color(forKey: "MainWindow.Detail.backgroundColor")
|
||||
// layer.backgroundColor = color.cgColor
|
||||
// didConfigureLayer = true
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
// MARK: -
|
||||
|
@ -1,6 +1,4 @@
|
||||
body {
|
||||
color: #444;
|
||||
background-color: white;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 64px;
|
||||
margin-left: 64px;
|
||||
@ -8,30 +6,53 @@ body {
|
||||
font-family: -apple-system;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
a, a:link, a:visited {
|
||||
color: #416ED2;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.feedlink {
|
||||
font-weight: bold;
|
||||
}
|
||||
.headerTable {
|
||||
width: 100%;
|
||||
height: 68px;
|
||||
}
|
||||
|
||||
/* Light mode */
|
||||
|
||||
body.light {
|
||||
color: -webkit-text;
|
||||
background-color: -apple-system-text-background;
|
||||
}
|
||||
|
||||
body.light a, body.light a:link, body.light a:visited {
|
||||
color: -apple-system-blue;
|
||||
}
|
||||
body.light .headerTable {
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
/* Dark mode */
|
||||
|
||||
body.dark {
|
||||
color: #d2d2d2;
|
||||
background-color: #2d2d2d;
|
||||
}
|
||||
body.dark a, body.dark a:link, body.dark a:visited {
|
||||
color: #4490e2;
|
||||
}
|
||||
body.dark .headerTable {
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
.header a:link, .header a:visited {
|
||||
color: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
.header {
|
||||
color: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
.feedlink {
|
||||
font-weight: bold;
|
||||
}
|
||||
.feedlink a:link, .feedlink a:visited {
|
||||
color: rgba(0, 0, 0, 0.6);
|
||||
}
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
import RSCore
|
||||
|
||||
|
@ -10,9 +10,9 @@ import AppKit
|
||||
|
||||
class MainWindowSplitView: NSSplitView {
|
||||
|
||||
private let splitViewDividerColor = NSColor(calibratedWhite: 0.75, alpha: 1.0)
|
||||
|
||||
override var dividerColor: NSColor {
|
||||
return splitViewDividerColor
|
||||
}
|
||||
// private let splitViewDividerColor = NSColor(calibratedWhite: 0.75, alpha: 1.0)
|
||||
//
|
||||
// override var dividerColor: NSColor {
|
||||
// return splitViewDividerColor
|
||||
// }
|
||||
}
|
||||
|
@ -7,7 +7,8 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
import RSCore
|
||||
|
||||
extension Feed: PasteboardWriterOwner {
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import AppKit
|
||||
import RSTree
|
||||
import Data
|
||||
import Articles
|
||||
import RSCore
|
||||
|
||||
@objc final class SidebarOutlineDataSource: NSObject, NSOutlineViewDataSource {
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import AppKit
|
||||
import RSCore
|
||||
import Data
|
||||
import Articles
|
||||
import RSWeb
|
||||
import Account
|
||||
|
||||
@ -17,8 +17,6 @@ final class SidebarStatusBarView: NSView {
|
||||
@IBOutlet var progressIndicator: NSProgressIndicator!
|
||||
@IBOutlet var progressLabel: NSTextField!
|
||||
|
||||
private var didConfigureLayer = false
|
||||
|
||||
private var isAnimatingProgress = false {
|
||||
didSet {
|
||||
progressIndicator.isHidden = !isAnimatingProgress
|
||||
@ -35,10 +33,6 @@ final class SidebarStatusBarView: NSView {
|
||||
return true
|
||||
}
|
||||
|
||||
override var wantsUpdateLayer: Bool {
|
||||
return true
|
||||
}
|
||||
|
||||
override func awakeFromNib() {
|
||||
|
||||
progressIndicator.isHidden = true
|
||||
@ -51,17 +45,6 @@ final class SidebarStatusBarView: NSView {
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(progressDidChange(_:)), name: .AccountRefreshProgressDidChange, object: nil)
|
||||
}
|
||||
|
||||
override func updateLayer() {
|
||||
|
||||
guard let layer = layer, !didConfigureLayer else {
|
||||
return
|
||||
}
|
||||
|
||||
let color = NSColor(calibratedWhite: 0.96, alpha: 1.0)
|
||||
layer.backgroundColor = color.cgColor
|
||||
didConfigureLayer = true
|
||||
}
|
||||
|
||||
@objc func updateUI() {
|
||||
|
||||
guard let progress = progress else {
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import RSTree
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
|
||||
final class SidebarTreeControllerDelegate: TreeControllerDelegate {
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
import RSCore
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import AppKit
|
||||
import RSTree
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
import RSCore
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
typealias ArticleArray = [Article]
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
import RSCore
|
||||
|
||||
extension Article: PasteboardWriterOwner {
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
struct TimelineCellData {
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Data
|
||||
import Articles
|
||||
import RSParser
|
||||
|
||||
// TODO: Don’t make all this at top level.
|
||||
|
@ -48,13 +48,13 @@ class TimelineTableCellView: NSTableCellView {
|
||||
return true
|
||||
}
|
||||
|
||||
override var isOpaque: Bool {
|
||||
return true
|
||||
}
|
||||
|
||||
override var wantsUpdateLayer: Bool {
|
||||
return true
|
||||
}
|
||||
// override var isOpaque: Bool {
|
||||
// return true
|
||||
// }
|
||||
//
|
||||
// override var wantsUpdateLayer: Bool {
|
||||
// return true
|
||||
// }
|
||||
|
||||
var isEmphasized = false {
|
||||
didSet {
|
||||
@ -122,20 +122,20 @@ class TimelineTableCellView: NSTableCellView {
|
||||
starView.rs_setFrameIfNotEqual(layoutRects.starRect)
|
||||
}
|
||||
|
||||
override func updateLayer() {
|
||||
|
||||
let color: NSColor
|
||||
if isSelected {
|
||||
color = isEmphasized ? NSColor.alternateSelectedControlColor : NSColor.secondarySelectedControlColor
|
||||
}
|
||||
else {
|
||||
color = NSColor.white
|
||||
}
|
||||
|
||||
if layer?.backgroundColor != color.cgColor {
|
||||
layer?.backgroundColor = color.cgColor
|
||||
}
|
||||
}
|
||||
// override func updateLayer() {
|
||||
//
|
||||
// let color: NSColor
|
||||
// if isSelected {
|
||||
// color = isEmphasized ? NSColor.alternateSelectedControlColor : NSColor.secondarySelectedControlColor
|
||||
// }
|
||||
// else {
|
||||
// color = NSColor.white
|
||||
// }
|
||||
//
|
||||
// if layer?.backgroundColor != color.cgColor {
|
||||
// layer?.backgroundColor = color.cgColor
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
@ -188,17 +188,23 @@ private extension TimelineTableCellView {
|
||||
func updateTextFieldColors() {
|
||||
|
||||
updateTitleView()
|
||||
|
||||
titleView.textColor = NSColor.labelColor
|
||||
feedNameView.textColor = NSColor.secondaryLabelColor
|
||||
dateView.textColor = NSColor.secondaryLabelColor
|
||||
summaryView.textColor = NSColor.secondaryLabelColor
|
||||
textView.textColor = NSColor.labelColor
|
||||
|
||||
if isEmphasized && isSelected {
|
||||
textFields.forEach { $0.textColor = NSColor.white }
|
||||
}
|
||||
else {
|
||||
feedNameView.textColor = cellAppearance.feedNameColor
|
||||
dateView.textColor = cellAppearance.dateColor
|
||||
titleView.textColor = cellAppearance.titleColor
|
||||
summaryView.textColor = cellAppearance.textColor
|
||||
textView.textColor = cellAppearance.textOnlyColor
|
||||
}
|
||||
// if isEmphasized && isSelected {
|
||||
// textFields.forEach { $0.textColor = NSColor.white }
|
||||
// }
|
||||
// else {
|
||||
// feedNameView.textColor = cellAppearance.feedNameColor
|
||||
// dateView.textColor = cellAppearance.dateColor
|
||||
// titleView.textColor = cellAppearance.titleColor
|
||||
// summaryView.textColor = cellAppearance.textColor
|
||||
// textView.textColor = cellAppearance.textOnlyColor
|
||||
// }
|
||||
}
|
||||
|
||||
func updateTextFieldFonts() {
|
||||
|
@ -37,8 +37,13 @@ class UnreadIndicatorView: NSView {
|
||||
|
||||
override func draw(_ dirtyRect: NSRect) {
|
||||
|
||||
let color = isEmphasized && isSelected ? NSColor.white : UnreadIndicatorView.unreadCircleColor
|
||||
color.setFill()
|
||||
if #available(OSX 10.14, *) {
|
||||
let color = isEmphasized && isSelected ? NSColor.white : NSColor.controlAccentColor
|
||||
color.setFill()
|
||||
} else {
|
||||
let color = isEmphasized && isSelected ? NSColor.white : NSColor.systemBlue
|
||||
color.setFill()
|
||||
}
|
||||
UnreadIndicatorView.bezierPath.fill()
|
||||
}
|
||||
|
||||
|
@ -1,30 +0,0 @@
|
||||
//
|
||||
// TimelineHeaderView.swift
|
||||
// Evergreen
|
||||
//
|
||||
// Created by Brent Simmons on 11/29/17.
|
||||
// Copyright © 2017 Ranchero Software. All rights reserved.
|
||||
//
|
||||
|
||||
import AppKit
|
||||
|
||||
final class TimelineHeaderView: NSView {
|
||||
|
||||
private var didConfigureLayer = false
|
||||
|
||||
override var wantsUpdateLayer: Bool {
|
||||
return true
|
||||
}
|
||||
|
||||
override func updateLayer() {
|
||||
|
||||
guard !didConfigureLayer else {
|
||||
return
|
||||
}
|
||||
if let layer = layer {
|
||||
let color = appDelegate.currentTheme.color(forKey: "MainWindow.Timeline.header.backgroundColor")
|
||||
layer.backgroundColor = color.cgColor
|
||||
didConfigureLayer = true
|
||||
}
|
||||
}
|
||||
}
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
|
||||
extension TimelineViewController {
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import RSCore
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
|
||||
class TimelineViewController: NSViewController, UndoableCommandRunner {
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import AppKit
|
||||
import Account
|
||||
import Data
|
||||
import Articles
|
||||
import RSCore
|
||||
|
||||
@objc(ScriptableAccount)
|
||||
|
@ -17,7 +17,7 @@
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
protocol AppDelegateAppleEvents {
|
||||
func installAppleEventHandlers()
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import Account
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
@objc(ScriptableArticle)
|
||||
class ScriptableArticle: NSObject, UniqueIdScriptingObject, ScriptingObjectContainer {
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import Account
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
@objc(ScriptableAuthor)
|
||||
class ScriptableAuthor: NSObject, UniqueIdScriptingObject {
|
||||
|
@ -9,7 +9,7 @@
|
||||
import Foundation
|
||||
import RSParser
|
||||
import Account
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
@objc(ScriptableFeed)
|
||||
class ScriptableFeed: NSObject, UniqueIdScriptingObject, ScriptingObjectContainer{
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import Account
|
||||
import Data
|
||||
import Articles
|
||||
import RSCore
|
||||
|
||||
@objc(ScriptableFolder)
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
protocol ScriptingMainWindowController {
|
||||
var scriptingCurrentArticle: Article? { get }
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import AppKit
|
||||
import Account
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
extension NSApplication : ScriptingObjectContainer {
|
||||
|
||||
|
@ -7,7 +7,8 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
import RSCore
|
||||
|
||||
protocol PseudoFeed: class, DisplayNameProvider, UnreadCountProvider, SmallIconProvider, PasteboardWriterOwner {
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import RSCore
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
|
||||
protocol SmartFeedDelegate: DisplayNameProvider, ArticleFetcher {
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Data
|
||||
import Articles
|
||||
import Account
|
||||
|
||||
struct TodayFeedDelegate: SmartFeedDelegate {
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import AppKit
|
||||
import Account
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
// This just shows the global unread count, which appDelegate already has. Easy.
|
||||
|
||||
|
@ -8,9 +8,9 @@
|
||||
|
||||
import Foundation
|
||||
import RSCore
|
||||
import Data
|
||||
import Articles
|
||||
import RSParser
|
||||
import Database
|
||||
import ArticlesDatabase
|
||||
import RSWeb
|
||||
|
||||
public extension Notification.Name {
|
||||
@ -53,7 +53,7 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
||||
var idToFeedDictionary = [String: Feed]()
|
||||
let settingsFile: String
|
||||
let dataFolder: String
|
||||
let database: Database
|
||||
let database: ArticlesDatabase
|
||||
let delegate: AccountDelegate
|
||||
var username: String?
|
||||
static let saveQueue = CoalescingQueue(name: "Account Save Queue", interval: 1.0)
|
||||
@ -109,7 +109,7 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
||||
self.hashValue = accountID.hashValue
|
||||
|
||||
let databaseFilePath = (dataFolder as NSString).appendingPathComponent("DB.sqlite3")
|
||||
self.database = Database(databaseFilePath: databaseFilePath, accountID: accountID)
|
||||
self.database = ArticlesDatabase(databaseFilePath: databaseFilePath, accountID: accountID)
|
||||
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(downloadProgressDidChange(_:)), name: .DownloadProgressDidChange, object: nil)
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil)
|
||||
@ -140,7 +140,7 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
||||
|
||||
feed.takeSettings(from: parsedFeed)
|
||||
|
||||
database.update(feed: feed, parsedFeed: parsedFeed) { (newArticles, updatedArticles) in
|
||||
database.update(feedID: feed.feedID, parsedFeed: parsedFeed) { (newArticles, updatedArticles) in
|
||||
|
||||
var userInfo = [String: Any]()
|
||||
if let newArticles = newArticles, !newArticles.isEmpty {
|
||||
@ -302,10 +302,10 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
||||
return
|
||||
}
|
||||
|
||||
database.fetchUnreadCounts(for: feeds) { (unreadCountDictionary) in
|
||||
database.fetchUnreadCounts(for: feeds.feedIDs()) { (unreadCountDictionary) in
|
||||
|
||||
for feed in feeds {
|
||||
if let unreadCount = unreadCountDictionary[feed] {
|
||||
if let unreadCount = unreadCountDictionary[feed.feedID] {
|
||||
feed.unreadCount = unreadCount
|
||||
}
|
||||
}
|
||||
@ -314,14 +314,14 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
||||
|
||||
public func fetchArticles(for feed: Feed) -> Set<Article> {
|
||||
|
||||
let articles = database.fetchArticles(for: feed)
|
||||
let articles = database.fetchArticles(for: feed.feedID)
|
||||
validateUnreadCount(feed, articles)
|
||||
return articles
|
||||
}
|
||||
|
||||
public func fetchUnreadArticles(for feed: Feed) -> Set<Article> {
|
||||
|
||||
let articles = database.fetchUnreadArticles(for: Set([feed]))
|
||||
let articles = database.fetchUnreadArticles(for: Set([feed.feedID]))
|
||||
validateUnreadCount(feed, articles)
|
||||
return articles
|
||||
}
|
||||
@ -339,19 +339,19 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
||||
public func fetchUnreadArticles(forContainer container: Container) -> Set<Article> {
|
||||
|
||||
let feeds = container.flattenedFeeds()
|
||||
let articles = database.fetchUnreadArticles(for: feeds)
|
||||
let articles = database.fetchUnreadArticles(for: feeds.feedIDs())
|
||||
feeds.forEach { validateUnreadCount($0, articles) }
|
||||
return articles
|
||||
}
|
||||
|
||||
public func fetchTodayArticles() -> Set<Article> {
|
||||
|
||||
return database.fetchTodayArticles(for: flattenedFeeds())
|
||||
return database.fetchTodayArticles(for: flattenedFeeds().feedIDs())
|
||||
}
|
||||
|
||||
public func fetchStarredArticles() -> Set<Article> {
|
||||
|
||||
return database.fetchStarredArticles(for: flattenedFeeds())
|
||||
return database.fetchStarredArticles(for: flattenedFeeds().feedIDs())
|
||||
}
|
||||
|
||||
private func validateUnreadCount(_ feed: Feed, _ articles: Set<Article>) {
|
||||
@ -372,12 +372,12 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
||||
public func fetchUnreadCountForToday(_ callback: @escaping (Int) -> Void) {
|
||||
|
||||
let startOfToday = NSCalendar.startOfToday()
|
||||
database.fetchUnreadCount(for: flattenedFeeds(), since: startOfToday, callback: callback)
|
||||
database.fetchUnreadCount(for: flattenedFeeds().feedIDs(), since: startOfToday, callback: callback)
|
||||
}
|
||||
|
||||
public func fetchUnreadCountForStarredArticles(_ callback: @escaping (Int) -> Void) {
|
||||
|
||||
database.fetchStarredAndUnreadCount(for: flattenedFeeds(), callback: callback)
|
||||
database.fetchStarredAndUnreadCount(for: flattenedFeeds().feedIDs(), callback: callback)
|
||||
}
|
||||
|
||||
public func markEverywhereAsRead() {
|
||||
@ -680,7 +680,7 @@ private extension Account {
|
||||
|
||||
// When the unread count is zero, it won’t appear in unreadCountDictionary.
|
||||
|
||||
if let unreadCount = unreadCountDictionary[feed] {
|
||||
if let unreadCount = unreadCountDictionary[feed.feedID] {
|
||||
feed.unreadCount = unreadCount
|
||||
}
|
||||
else {
|
||||
|
@ -7,16 +7,19 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
841973FD1F6DD1B7006346C4 /* Data.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841973E51F6DD195006346C4 /* Data.framework */; };
|
||||
841973FE1F6DD1BC006346C4 /* RSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841973EF1F6DD19E006346C4 /* RSCore.framework */; };
|
||||
841973FF1F6DD1C5006346C4 /* RSParser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841973FA1F6DD1AC006346C4 /* RSParser.framework */; };
|
||||
841974011F6DD1EC006346C4 /* Folder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841974001F6DD1EC006346C4 /* Folder.swift */; };
|
||||
841974251F6DDCE4006346C4 /* AccountDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841974241F6DDCE4006346C4 /* AccountDelegate.swift */; };
|
||||
841D4D702106B40400DD04E6 /* ArticlesDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841D4D6F2106B40400DD04E6 /* ArticlesDatabase.framework */; };
|
||||
841D4D722106B40A00DD04E6 /* Articles.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841D4D712106B40A00DD04E6 /* Articles.framework */; };
|
||||
84245C7F1FDDD2580074AFBB /* FeedbinAccountDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84245C7E1FDDD2580074AFBB /* FeedbinAccountDelegate.swift */; };
|
||||
84245C811FDDD42A0074AFBB /* Feedbin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84245C801FDDD42A0074AFBB /* Feedbin.swift */; };
|
||||
84245C831FDDD8160074AFBB /* FeedbinGetSubscriptionsDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84245C821FDDD8160074AFBB /* FeedbinGetSubscriptionsDelegate.swift */; };
|
||||
84245C851FDDD8CB0074AFBB /* FeedbinSubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84245C841FDDD8CB0074AFBB /* FeedbinSubscription.swift */; };
|
||||
8469F8171F6DD0AD0084783E /* Database.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8401A17D1F6DC388002B1BE2 /* Database.framework */; };
|
||||
844B297D2106C7EC004020B3 /* Feed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 844B297C2106C7EC004020B3 /* Feed.swift */; };
|
||||
844B297F210CE37E004020B3 /* UnreadCountProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 844B297E210CE37E004020B3 /* UnreadCountProvider.swift */; };
|
||||
844B2981210CE3BF004020B3 /* RSWeb.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 844B2980210CE3BF004020B3 /* RSWeb.framework */; };
|
||||
8469F81C1F6DD15E0084783E /* Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = 848935101F62486800CEBD24 /* Account.swift */; };
|
||||
846E77451F6EF9B900A165E2 /* Container.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8419740D1F6DD25F006346C4 /* Container.swift */; };
|
||||
846E774F1F6EF9C000A165E2 /* LocalAccountDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8419742C1F6DDE84006346C4 /* LocalAccountDelegate.swift */; };
|
||||
@ -32,34 +35,6 @@
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
8401A17C1F6DC388002B1BE2 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 8401A1721F6DC387002B1BE2 /* Database.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 844BEE371F0AB3AA004AB7CD;
|
||||
remoteInfo = Database;
|
||||
};
|
||||
8401A17E1F6DC388002B1BE2 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 8401A1721F6DC387002B1BE2 /* Database.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 844BEE401F0AB3AB004AB7CD;
|
||||
remoteInfo = DatabaseTests;
|
||||
};
|
||||
841973E41F6DD195006346C4 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 841973DF1F6DD194006346C4 /* Data.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 844BEE5B1F0AB3C8004AB7CD;
|
||||
remoteInfo = Data;
|
||||
};
|
||||
841973E61F6DD195006346C4 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 841973DF1F6DD194006346C4 /* Data.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 844BEE641F0AB3C9004AB7CD;
|
||||
remoteInfo = DataTests;
|
||||
};
|
||||
841973EE1F6DD19E006346C4 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 841973E81F6DD19E006346C4 /* RSCore.xcodeproj */;
|
||||
@ -105,8 +80,6 @@
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
8401A1721F6DC387002B1BE2 /* Database.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Database.xcodeproj; path = ../Database/Database.xcodeproj; sourceTree = "<group>"; };
|
||||
841973DF1F6DD194006346C4 /* Data.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Data.xcodeproj; path = ../Data/Data.xcodeproj; sourceTree = "<group>"; };
|
||||
841973E81F6DD19E006346C4 /* RSCore.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSCore.xcodeproj; path = ../RSCore/RSCore.xcodeproj; sourceTree = "<group>"; };
|
||||
841973F41F6DD1AC006346C4 /* RSParser.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSParser.xcodeproj; path = ../RSParser/RSParser.xcodeproj; sourceTree = "<group>"; };
|
||||
841974001F6DD1EC006346C4 /* Folder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Folder.swift; sourceTree = "<group>"; };
|
||||
@ -114,10 +87,15 @@
|
||||
841974241F6DDCE4006346C4 /* AccountDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountDelegate.swift; sourceTree = "<group>"; };
|
||||
8419742C1F6DDE84006346C4 /* LocalAccountDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAccountDelegate.swift; sourceTree = "<group>"; };
|
||||
8419742D1F6DDE96006346C4 /* LocalAccountRefresher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAccountRefresher.swift; sourceTree = "<group>"; };
|
||||
841D4D6F2106B40400DD04E6 /* ArticlesDatabase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ArticlesDatabase.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
841D4D712106B40A00DD04E6 /* Articles.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Articles.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
84245C7E1FDDD2580074AFBB /* FeedbinAccountDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedbinAccountDelegate.swift; sourceTree = "<group>"; };
|
||||
84245C801FDDD42A0074AFBB /* Feedbin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Feedbin.swift; sourceTree = "<group>"; };
|
||||
84245C821FDDD8160074AFBB /* FeedbinGetSubscriptionsDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinGetSubscriptionsDelegate.swift; sourceTree = "<group>"; };
|
||||
84245C841FDDD8CB0074AFBB /* FeedbinSubscription.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinSubscription.swift; sourceTree = "<group>"; };
|
||||
844B297C2106C7EC004020B3 /* Feed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Feed.swift; sourceTree = "<group>"; };
|
||||
844B297E210CE37E004020B3 /* UnreadCountProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnreadCountProvider.swift; sourceTree = "<group>"; };
|
||||
844B2980210CE3BF004020B3 /* RSWeb.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RSWeb.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
846E77531F6F00E300A165E2 /* AccountManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountManager.swift; sourceTree = "<group>"; };
|
||||
848934F61F62484F00CEBD24 /* Account.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Account.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
848934FA1F62484F00CEBD24 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
@ -142,10 +120,11 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
844B2981210CE3BF004020B3 /* RSWeb.framework in Frameworks */,
|
||||
841D4D722106B40A00DD04E6 /* Articles.framework in Frameworks */,
|
||||
841D4D702106B40400DD04E6 /* ArticlesDatabase.framework in Frameworks */,
|
||||
841973FE1F6DD1BC006346C4 /* RSCore.framework in Frameworks */,
|
||||
841973FF1F6DD1C5006346C4 /* RSParser.framework in Frameworks */,
|
||||
841973FD1F6DD1B7006346C4 /* Data.framework in Frameworks */,
|
||||
8469F8171F6DD0AD0084783E /* Database.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -160,24 +139,6 @@
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
8401A1731F6DC387002B1BE2 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8401A17D1F6DC388002B1BE2 /* Database.framework */,
|
||||
8401A17F1F6DC388002B1BE2 /* DatabaseTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
841973E01F6DD194006346C4 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
841973E51F6DD195006346C4 /* Data.framework */,
|
||||
841973E71F6DD195006346C4 /* DataTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
841973E91F6DD19E006346C4 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -221,8 +182,9 @@
|
||||
8469F80F1F6DC3C10084783E /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8401A1721F6DC387002B1BE2 /* Database.xcodeproj */,
|
||||
841973DF1F6DD194006346C4 /* Data.xcodeproj */,
|
||||
844B2980210CE3BF004020B3 /* RSWeb.framework */,
|
||||
841D4D712106B40A00DD04E6 /* Articles.framework */,
|
||||
841D4D6F2106B40400DD04E6 /* ArticlesDatabase.framework */,
|
||||
841973F41F6DD1AC006346C4 /* RSParser.xcodeproj */,
|
||||
841973E81F6DD19E006346C4 /* RSCore.xcodeproj */,
|
||||
);
|
||||
@ -236,6 +198,8 @@
|
||||
848935101F62486800CEBD24 /* Account.swift */,
|
||||
841974241F6DDCE4006346C4 /* AccountDelegate.swift */,
|
||||
841974001F6DD1EC006346C4 /* Folder.swift */,
|
||||
844B297C2106C7EC004020B3 /* Feed.swift */,
|
||||
844B297E210CE37E004020B3 /* UnreadCountProvider.swift */,
|
||||
84B99C9E1FAE8D3200ECDEDB /* ContainerPath.swift */,
|
||||
84C365491F899F3B001EC85C /* CombinedRefreshProgress.swift */,
|
||||
84C8B3F31F89DE430053CCA6 /* DataExtensions.swift */,
|
||||
@ -362,14 +326,6 @@
|
||||
productRefGroup = 848934F71F62484F00CEBD24 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectReferences = (
|
||||
{
|
||||
ProductGroup = 841973E01F6DD194006346C4 /* Products */;
|
||||
ProjectRef = 841973DF1F6DD194006346C4 /* Data.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 8401A1731F6DC387002B1BE2 /* Products */;
|
||||
ProjectRef = 8401A1721F6DC387002B1BE2 /* Database.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 841973E91F6DD19E006346C4 /* Products */;
|
||||
ProjectRef = 841973E81F6DD19E006346C4 /* RSCore.xcodeproj */;
|
||||
@ -388,34 +344,6 @@
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXReferenceProxy section */
|
||||
8401A17D1F6DC388002B1BE2 /* Database.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = Database.framework;
|
||||
remoteRef = 8401A17C1F6DC388002B1BE2 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
8401A17F1F6DC388002B1BE2 /* DatabaseTests.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = DatabaseTests.xctest;
|
||||
remoteRef = 8401A17E1F6DC388002B1BE2 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
841973E51F6DD195006346C4 /* Data.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = Data.framework;
|
||||
remoteRef = 841973E41F6DD195006346C4 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
841973E71F6DD195006346C4 /* DataTests.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = DataTests.xctest;
|
||||
remoteRef = 841973E61F6DD195006346C4 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
841973EF1F6DD19E006346C4 /* RSCore.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
@ -483,12 +411,14 @@
|
||||
84245C7F1FDDD2580074AFBB /* FeedbinAccountDelegate.swift in Sources */,
|
||||
841974251F6DDCE4006346C4 /* AccountDelegate.swift in Sources */,
|
||||
846E77541F6F00E300A165E2 /* AccountManager.swift in Sources */,
|
||||
844B297D2106C7EC004020B3 /* Feed.swift in Sources */,
|
||||
84B99C9F1FAE8D3200ECDEDB /* ContainerPath.swift in Sources */,
|
||||
846E77501F6EF9C400A165E2 /* LocalAccountRefresher.swift in Sources */,
|
||||
84245C811FDDD42A0074AFBB /* Feedbin.swift in Sources */,
|
||||
84CAD7161FDF2E22000F0755 /* FeedbinArticle.swift in Sources */,
|
||||
841974011F6DD1EC006346C4 /* Folder.swift in Sources */,
|
||||
846E774F1F6EF9C000A165E2 /* LocalAccountDelegate.swift in Sources */,
|
||||
844B297F210CE37E004020B3 /* UnreadCountProvider.swift in Sources */,
|
||||
84245C851FDDD8CB0074AFBB /* FeedbinSubscription.swift in Sources */,
|
||||
84245C831FDDD8160074AFBB /* FeedbinGetSubscriptionsDelegate.swift in Sources */,
|
||||
);
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import RSCore
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
let AccountsDidChangeNotification = "AccountsDidChangeNotification"
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
public protocol ArticleFetcher {
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
import Foundation
|
||||
import RSCore
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
extension Notification.Name {
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Data
|
||||
import Articles
|
||||
import RSParser
|
||||
|
||||
public extension Notification.Name {
|
||||
|
@ -9,6 +9,7 @@
|
||||
import Foundation
|
||||
import RSCore
|
||||
import RSWeb
|
||||
import Articles
|
||||
|
||||
public final class Feed: DisplayNameProvider, UnreadCountProvider, Hashable {
|
||||
|
||||
@ -189,3 +190,10 @@ extension Feed: OPMLRepresentable {
|
||||
}
|
||||
}
|
||||
|
||||
extension Set where Element == Feed {
|
||||
|
||||
func feedIDs() -> Set<String> {
|
||||
|
||||
return Set<String>(map { $0.feedID })
|
||||
}
|
||||
}
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Data
|
||||
import Articles
|
||||
import RSCore
|
||||
|
||||
public final class Folder: DisplayNameProvider, Container, UnreadCountProvider, Hashable {
|
||||
|
@ -10,7 +10,7 @@ import Foundation
|
||||
import RSCore
|
||||
import RSParser
|
||||
import RSWeb
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
final class LocalAccountRefresher {
|
||||
|
||||
|
@ -8,16 +8,13 @@
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
840405CA1F1A8E4300DF0296 /* DatabaseID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840405C91F1A8E4300DF0296 /* DatabaseID.swift */; };
|
||||
8419741C1F6DD613006346C4 /* UnreadCountProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8419741B1F6DD613006346C4 /* UnreadCountProvider.swift */; };
|
||||
843079FA1F0AB57F00B4B7F7 /* RSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 844BEEA31F0AB512004AB7CD /* RSCore.framework */; };
|
||||
844BEE651F0AB3C9004AB7CD /* Data.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 844BEE5B1F0AB3C8004AB7CD /* Data.framework */; };
|
||||
844BEE651F0AB3C9004AB7CD /* Articles.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 844BEE5B1F0AB3C8004AB7CD /* Articles.framework */; };
|
||||
844BEE6A1F0AB3C9004AB7CD /* DataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 844BEE691F0AB3C9004AB7CD /* DataTests.swift */; };
|
||||
844BEE7D1F0AB4C4004AB7CD /* Feed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 844BEE7C1F0AB4C4004AB7CD /* Feed.swift */; };
|
||||
844BEE7F1F0AB4CA004AB7CD /* Article.swift in Sources */ = {isa = PBXBuildFile; fileRef = 844BEE7E1F0AB4CA004AB7CD /* Article.swift */; };
|
||||
844BEE811F0AB4D0004AB7CD /* Author.swift in Sources */ = {isa = PBXBuildFile; fileRef = 844BEE801F0AB4D0004AB7CD /* Author.swift */; };
|
||||
844BEE831F0AB4D6004AB7CD /* Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 844BEE821F0AB4D6004AB7CD /* Attachment.swift */; };
|
||||
844BEE851F0AB4DB004AB7CD /* ArticleStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 844BEE841F0AB4DB004AB7CD /* ArticleStatus.swift */; };
|
||||
84C490F41F705D5F003131D2 /* RSWeb.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C490F51F705D5F003131D2 /* RSWeb.framework */; };
|
||||
848E3EB420FBCFAE0004B7ED /* RSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 848E3EB320FBCFAE0004B7ED /* RSCore.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@ -53,29 +50,23 @@
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
840405C91F1A8E4300DF0296 /* DatabaseID.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseID.swift; sourceTree = "<group>"; };
|
||||
8419741B1F6DD613006346C4 /* UnreadCountProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnreadCountProvider.swift; sourceTree = "<group>"; };
|
||||
844BEE5B1F0AB3C8004AB7CD /* Data.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Data.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
844BEE641F0AB3C9004AB7CD /* DataTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DataTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
844BEE5B1F0AB3C8004AB7CD /* Articles.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Articles.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
844BEE641F0AB3C9004AB7CD /* ArticlesTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ArticlesTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
844BEE691F0AB3C9004AB7CD /* DataTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataTests.swift; sourceTree = "<group>"; };
|
||||
844BEE6B1F0AB3C9004AB7CD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
844BEE761F0AB444004AB7CD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
844BEE7C1F0AB4C4004AB7CD /* Feed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Feed.swift; sourceTree = "<group>"; };
|
||||
844BEE7E1F0AB4CA004AB7CD /* Article.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Article.swift; sourceTree = "<group>"; };
|
||||
844BEE801F0AB4D0004AB7CD /* Author.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Author.swift; sourceTree = "<group>"; };
|
||||
844BEE821F0AB4D6004AB7CD /* Attachment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Attachment.swift; sourceTree = "<group>"; };
|
||||
844BEE841F0AB4DB004AB7CD /* ArticleStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ArticleStatus.swift; sourceTree = "<group>"; };
|
||||
844BEE9C1F0AB512004AB7CD /* RSCore.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSCore.xcodeproj; path = ../RSCore/RSCore.xcodeproj; sourceTree = "<group>"; };
|
||||
848E3EB320FBCFAE0004B7ED /* RSCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RSCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
84C490F51F705D5F003131D2 /* RSWeb.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RSWeb.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D511EEC420242DF400712EC3 /* DataTests_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DataTests_target.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEC520242DF400712EC3 /* Data_project_debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Data_project_debug.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEC620242DF400712EC3 /* Data_project.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Data_project.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEC720242DF400712EC3 /* Data_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Data_target.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEC820242DF400712EC3 /* Data_project_release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Data_project_release.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE020242DFB00712EC3 /* DataTests_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DataTests_target.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE120242DFB00712EC3 /* Data_project_debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Data_project_debug.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE220242DFB00712EC3 /* Data_project.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Data_project.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE320242DFB00712EC3 /* Data_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Data_target.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE420242DFB00712EC3 /* Data_project_release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Data_project_release.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE020242DFB00712EC3 /* ArticlesDataTests_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ArticlesDataTests_target.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE120242DFB00712EC3 /* Articles_project_debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Articles_project_debug.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE220242DFB00712EC3 /* Articles_project.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Articles_project.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE320242DFB00712EC3 /* Articles_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Articles_target.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE420242DFB00712EC3 /* Articles_project_release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Articles_project_release.xcconfig; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -83,8 +74,7 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
84C490F41F705D5F003131D2 /* RSWeb.framework in Frameworks */,
|
||||
843079FA1F0AB57F00B4B7F7 /* RSCore.framework in Frameworks */,
|
||||
848E3EB420FBCFAE0004B7ED /* RSCore.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -92,7 +82,7 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
844BEE651F0AB3C9004AB7CD /* Data.framework in Frameworks */,
|
||||
844BEE651F0AB3C9004AB7CD /* Articles.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -102,14 +92,11 @@
|
||||
844BEE511F0AB3C8004AB7CD = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D511EEC320242DF400712EC3 /* xcconfig */,
|
||||
844BEE7C1F0AB4C4004AB7CD /* Feed.swift */,
|
||||
844BEE7E1F0AB4CA004AB7CD /* Article.swift */,
|
||||
844BEE801F0AB4D0004AB7CD /* Author.swift */,
|
||||
844BEE821F0AB4D6004AB7CD /* Attachment.swift */,
|
||||
844BEE841F0AB4DB004AB7CD /* ArticleStatus.swift */,
|
||||
840405C91F1A8E4300DF0296 /* DatabaseID.swift */,
|
||||
8419741B1F6DD613006346C4 /* UnreadCountProvider.swift */,
|
||||
844BEE761F0AB444004AB7CD /* Info.plist */,
|
||||
844BEE681F0AB3C9004AB7CD /* DataTests */,
|
||||
844BEE5C1F0AB3C8004AB7CD /* Products */,
|
||||
@ -121,8 +108,8 @@
|
||||
844BEE5C1F0AB3C8004AB7CD /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
844BEE5B1F0AB3C8004AB7CD /* Data.framework */,
|
||||
844BEE641F0AB3C9004AB7CD /* DataTests.xctest */,
|
||||
844BEE5B1F0AB3C8004AB7CD /* Articles.framework */,
|
||||
844BEE641F0AB3C9004AB7CD /* ArticlesTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
@ -149,32 +136,21 @@
|
||||
844BEEA81F0AB520004AB7CD /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
848E3EB320FBCFAE0004B7ED /* RSCore.framework */,
|
||||
84C490F51F705D5F003131D2 /* RSWeb.framework */,
|
||||
844BEE9C1F0AB512004AB7CD /* RSCore.xcodeproj */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D511EEC320242DF400712EC3 /* xcconfig */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D511EEC420242DF400712EC3 /* DataTests_target.xcconfig */,
|
||||
D511EEC520242DF400712EC3 /* Data_project_debug.xcconfig */,
|
||||
D511EEC620242DF400712EC3 /* Data_project.xcconfig */,
|
||||
D511EEC720242DF400712EC3 /* Data_target.xcconfig */,
|
||||
D511EEC820242DF400712EC3 /* Data_project_release.xcconfig */,
|
||||
);
|
||||
path = xcconfig;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D511EEE520242DFB00712EC3 /* xcconfig */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D511EEE220242DFB00712EC3 /* Data_project.xcconfig */,
|
||||
D511EEE120242DFB00712EC3 /* Data_project_debug.xcconfig */,
|
||||
D511EEE420242DFB00712EC3 /* Data_project_release.xcconfig */,
|
||||
D511EEE320242DFB00712EC3 /* Data_target.xcconfig */,
|
||||
D511EEE020242DFB00712EC3 /* DataTests_target.xcconfig */,
|
||||
D511EEE220242DFB00712EC3 /* Articles_project.xcconfig */,
|
||||
D511EEE120242DFB00712EC3 /* Articles_project_debug.xcconfig */,
|
||||
D511EEE420242DFB00712EC3 /* Articles_project_release.xcconfig */,
|
||||
D511EEE320242DFB00712EC3 /* Articles_target.xcconfig */,
|
||||
D511EEE020242DFB00712EC3 /* ArticlesDataTests_target.xcconfig */,
|
||||
);
|
||||
path = xcconfig;
|
||||
sourceTree = "<group>";
|
||||
@ -192,9 +168,9 @@
|
||||
/* End PBXHeadersBuildPhase section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
844BEE5A1F0AB3C8004AB7CD /* Data */ = {
|
||||
844BEE5A1F0AB3C8004AB7CD /* Articles */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 844BEE6F1F0AB3C9004AB7CD /* Build configuration list for PBXNativeTarget "Data" */;
|
||||
buildConfigurationList = 844BEE6F1F0AB3C9004AB7CD /* Build configuration list for PBXNativeTarget "Articles" */;
|
||||
buildPhases = (
|
||||
844BEE561F0AB3C8004AB7CD /* Sources */,
|
||||
844BEE571F0AB3C8004AB7CD /* Frameworks */,
|
||||
@ -205,14 +181,14 @@
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = Data;
|
||||
name = Articles;
|
||||
productName = Data;
|
||||
productReference = 844BEE5B1F0AB3C8004AB7CD /* Data.framework */;
|
||||
productReference = 844BEE5B1F0AB3C8004AB7CD /* Articles.framework */;
|
||||
productType = "com.apple.product-type.framework";
|
||||
};
|
||||
844BEE631F0AB3C9004AB7CD /* DataTests */ = {
|
||||
844BEE631F0AB3C9004AB7CD /* ArticlesTests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 844BEE721F0AB3C9004AB7CD /* Build configuration list for PBXNativeTarget "DataTests" */;
|
||||
buildConfigurationList = 844BEE721F0AB3C9004AB7CD /* Build configuration list for PBXNativeTarget "ArticlesTests" */;
|
||||
buildPhases = (
|
||||
844BEE601F0AB3C9004AB7CD /* Sources */,
|
||||
844BEE611F0AB3C9004AB7CD /* Frameworks */,
|
||||
@ -223,9 +199,9 @@
|
||||
dependencies = (
|
||||
844BEE671F0AB3C9004AB7CD /* PBXTargetDependency */,
|
||||
);
|
||||
name = DataTests;
|
||||
name = ArticlesTests;
|
||||
productName = DataTests;
|
||||
productReference = 844BEE641F0AB3C9004AB7CD /* DataTests.xctest */;
|
||||
productReference = 844BEE641F0AB3C9004AB7CD /* ArticlesTests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.unit-test";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
@ -240,18 +216,18 @@
|
||||
TargetAttributes = {
|
||||
844BEE5A1F0AB3C8004AB7CD = {
|
||||
CreatedOnToolsVersion = 8.3.2;
|
||||
DevelopmentTeam = 9C84TZ7Q6Z;
|
||||
DevelopmentTeam = M8L2WTLA8W;
|
||||
LastSwiftMigration = 0830;
|
||||
ProvisioningStyle = Automatic;
|
||||
};
|
||||
844BEE631F0AB3C9004AB7CD = {
|
||||
CreatedOnToolsVersion = 8.3.2;
|
||||
DevelopmentTeam = 9C84TZ7Q6Z;
|
||||
DevelopmentTeam = M8L2WTLA8W;
|
||||
ProvisioningStyle = Automatic;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 844BEE551F0AB3C8004AB7CD /* Build configuration list for PBXProject "Data" */;
|
||||
buildConfigurationList = 844BEE551F0AB3C8004AB7CD /* Build configuration list for PBXProject "Articles" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
@ -269,8 +245,8 @@
|
||||
);
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
844BEE5A1F0AB3C8004AB7CD /* Data */,
|
||||
844BEE631F0AB3C9004AB7CD /* DataTests */,
|
||||
844BEE5A1F0AB3C8004AB7CD /* Articles */,
|
||||
844BEE631F0AB3C9004AB7CD /* ArticlesTests */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
@ -322,9 +298,7 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
844BEE7F1F0AB4CA004AB7CD /* Article.swift in Sources */,
|
||||
844BEE7D1F0AB4C4004AB7CD /* Feed.swift in Sources */,
|
||||
844BEE831F0AB4D6004AB7CD /* Attachment.swift in Sources */,
|
||||
8419741C1F6DD613006346C4 /* UnreadCountProvider.swift in Sources */,
|
||||
844BEE811F0AB4D0004AB7CD /* Author.swift in Sources */,
|
||||
840405CA1F1A8E4300DF0296 /* DatabaseID.swift in Sources */,
|
||||
844BEE851F0AB4DB004AB7CD /* ArticleStatus.swift in Sources */,
|
||||
@ -344,7 +318,7 @@
|
||||
/* Begin PBXTargetDependency section */
|
||||
844BEE671F0AB3C9004AB7CD /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 844BEE5A1F0AB3C8004AB7CD /* Data */;
|
||||
target = 844BEE5A1F0AB3C8004AB7CD /* Articles */;
|
||||
targetProxy = 844BEE661F0AB3C9004AB7CD /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
@ -352,50 +326,58 @@
|
||||
/* Begin XCBuildConfiguration section */
|
||||
844BEE6D1F0AB3C9004AB7CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D511EEC520242DF400712EC3 /* Data_project_debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
SWIFT_VERSION = 4.2;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
844BEE6E1F0AB3C9004AB7CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D511EEC820242DF400712EC3 /* Data_project_release.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
SWIFT_VERSION = 4.2;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
844BEE701F0AB3C9004AB7CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D511EEC720242DF400712EC3 /* Data_target.xcconfig */;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Info.plist";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.ranchero.Articles;
|
||||
PRODUCT_NAME = Articles;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
844BEE711F0AB3C9004AB7CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D511EEC720242DF400712EC3 /* Data_target.xcconfig */;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Info.plist";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.ranchero.Articles;
|
||||
PRODUCT_NAME = Articles;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
844BEE731F0AB3C9004AB7CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D511EEC420242DF400712EC3 /* DataTests_target.xcconfig */;
|
||||
buildSettings = {
|
||||
PRODUCT_NAME = ArticlesTests;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
844BEE741F0AB3C9004AB7CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D511EEC420242DF400712EC3 /* DataTests_target.xcconfig */;
|
||||
buildSettings = {
|
||||
PRODUCT_NAME = ArticlesTests;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
844BEE551F0AB3C8004AB7CD /* Build configuration list for PBXProject "Data" */ = {
|
||||
844BEE551F0AB3C8004AB7CD /* Build configuration list for PBXProject "Articles" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
844BEE6D1F0AB3C9004AB7CD /* Debug */,
|
||||
@ -404,7 +386,7 @@
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
844BEE6F1F0AB3C9004AB7CD /* Build configuration list for PBXNativeTarget "Data" */ = {
|
||||
844BEE6F1F0AB3C9004AB7CD /* Build configuration list for PBXNativeTarget "Articles" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
844BEE701F0AB3C9004AB7CD /* Debug */,
|
||||
@ -413,7 +395,7 @@
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
844BEE721F0AB3C9004AB7CD /* Build configuration list for PBXNativeTarget "DataTests" */ = {
|
||||
844BEE721F0AB3C9004AB7CD /* Build configuration list for PBXNativeTarget "ArticlesTests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
844BEE731F0AB3C9004AB7CD /* Debug */,
|
@ -0,0 +1,80 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1000"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "844BEE5A1F0AB3C8004AB7CD"
|
||||
BuildableName = "Articles.framework"
|
||||
BlueprintName = "Articles"
|
||||
ReferencedContainer = "container:Articles.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "844BEE5A1F0AB3C8004AB7CD"
|
||||
BuildableName = "Articles.framework"
|
||||
BlueprintName = "Articles"
|
||||
ReferencedContainer = "container:Articles.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "844BEE5A1F0AB3C8004AB7CD"
|
||||
BuildableName = "Articles.framework"
|
||||
BlueprintName = "Articles"
|
||||
ReferencedContainer = "container:Articles.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
@ -7,7 +7,6 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import RSCore
|
||||
|
||||
public struct Author: Hashable {
|
||||
|
||||
@ -82,7 +81,7 @@ public struct Author: Hashable {
|
||||
return lhs.hashValue == rhs.hashValue && lhs.authorID == rhs.authorID
|
||||
}
|
||||
|
||||
static func authorsWithDiskArray(_ diskArray: [[String: Any]]) -> Set<Author>? {
|
||||
public static func authorsWithDiskArray(_ diskArray: [[String: Any]]) -> Set<Author>? {
|
||||
|
||||
let authors = diskArray.compactMap { Author(dictionary: $0) }
|
||||
return authors.isEmpty ? nil : Set(authors)
|
||||
@ -91,7 +90,7 @@ public struct Author: Hashable {
|
||||
|
||||
extension Set where Element == Author {
|
||||
|
||||
func diskArray() -> [[String: Any]]? {
|
||||
public func diskArray() -> [[String: Any]]? {
|
||||
|
||||
if self.isEmpty {
|
||||
return nil
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import Data
|
||||
@testable import Articles
|
||||
|
||||
class DataTests: XCTestCase {
|
||||
|
@ -1,7 +1,7 @@
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
|
||||
LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks
|
||||
INFOPLIST_FILE = DataTests/Info.plist
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.ranchero.DataTests
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.ranchero.ArticlesDataTests
|
||||
PRODUCT_NAME = $(TARGET_NAME)
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
#include "./Database_project.xcconfig"
|
||||
#include "./ArticlesData_project.xcconfig"
|
||||
|
||||
DEBUG_INFORMATION_FORMAT = dwarf
|
||||
ENABLE_TESTABILITY = YES
|
@ -1,4 +1,4 @@
|
||||
#include "./RSFeedFinder_project.xcconfig"
|
||||
#include "./ArticlesData_project.xcconfig"
|
||||
|
||||
DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
|
||||
ENABLE_NS_ASSERTIONS = NO
|
@ -8,7 +8,7 @@ LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_pa
|
||||
DEFINES_MODULE = YES
|
||||
FRAMEWORK_VERSION = A
|
||||
INFOPLIST_FILE = Info.plist
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.ranchero.Data
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.ranchero.Articles
|
||||
PRODUCT_NAME = $(TARGET_NAME)
|
||||
CLANG_ENABLE_MODULES = YES
|
||||
|
@ -1,5 +1,5 @@
|
||||
//
|
||||
// Database.swift
|
||||
// ArticlesDatabase.swift
|
||||
// Evergreen
|
||||
//
|
||||
// Created by Brent Simmons on 7/20/15.
|
||||
@ -10,7 +10,7 @@ import Foundation
|
||||
import RSCore
|
||||
import RSDatabase
|
||||
import RSParser
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
// This file and UnreadCountDictionary are the entirety of the public API for Database.framework.
|
||||
// Everything else is implementation.
|
||||
@ -19,7 +19,7 @@ public typealias ArticleResultBlock = (Set<Article>) -> Void
|
||||
public typealias UnreadCountCompletionBlock = (UnreadCountDictionary) -> Void
|
||||
public typealias UpdateArticlesWithFeedCompletionBlock = (Set<Article>?, Set<Article>?) -> Void //newArticles, updatedArticles
|
||||
|
||||
public final class Database {
|
||||
public final class ArticlesDatabase {
|
||||
|
||||
private let accountID: String
|
||||
private let articlesTable: ArticlesTable
|
||||
@ -42,46 +42,46 @@ public final class Database {
|
||||
|
||||
// MARK: - Fetching Articles
|
||||
|
||||
public func fetchArticles(for feed: Feed) -> Set<Article> {
|
||||
public func fetchArticles(for feedID: String) -> Set<Article> {
|
||||
|
||||
return articlesTable.fetchArticles(feed)
|
||||
return articlesTable.fetchArticles(feedID)
|
||||
}
|
||||
|
||||
public func fetchArticlesAsync(for feed: Feed, _ resultBlock: @escaping ArticleResultBlock) {
|
||||
public func fetchArticlesAsync(for feedID: String, _ resultBlock: @escaping ArticleResultBlock) {
|
||||
|
||||
articlesTable.fetchArticlesAsync(feed, withLimits: true, resultBlock)
|
||||
articlesTable.fetchArticlesAsync(feedID, withLimits: true, resultBlock)
|
||||
}
|
||||
|
||||
public func fetchUnreadArticles(for feeds: Set<Feed>) -> Set<Article> {
|
||||
public func fetchUnreadArticles(for feedIDs: Set<String>) -> Set<Article> {
|
||||
|
||||
return articlesTable.fetchUnreadArticles(for: feeds)
|
||||
return articlesTable.fetchUnreadArticles(for: feedIDs)
|
||||
}
|
||||
|
||||
public func fetchTodayArticles(for feeds: Set<Feed>) -> Set<Article> {
|
||||
public func fetchTodayArticles(for feedIDs: Set<String>) -> Set<Article> {
|
||||
|
||||
return articlesTable.fetchTodayArticles(for: feeds)
|
||||
return articlesTable.fetchTodayArticles(for: feedIDs)
|
||||
}
|
||||
|
||||
public func fetchStarredArticles(for feeds: Set<Feed>) -> Set<Article> {
|
||||
public func fetchStarredArticles(for feedIDs: Set<String>) -> Set<Article> {
|
||||
|
||||
return articlesTable.fetchStarredArticles(for: feeds)
|
||||
return articlesTable.fetchStarredArticles(for: feedIDs)
|
||||
}
|
||||
|
||||
// MARK: - Unread Counts
|
||||
|
||||
public func fetchUnreadCounts(for feeds: Set<Feed>, _ completion: @escaping UnreadCountCompletionBlock) {
|
||||
public func fetchUnreadCounts(for feedIDs: Set<String>, _ completion: @escaping UnreadCountCompletionBlock) {
|
||||
|
||||
articlesTable.fetchUnreadCounts(feeds, completion)
|
||||
articlesTable.fetchUnreadCounts(feedIDs, completion)
|
||||
}
|
||||
|
||||
public func fetchUnreadCount(for feeds: Set<Feed>, since: Date, callback: @escaping (Int) -> Void) {
|
||||
public func fetchUnreadCount(for feedIDs: Set<String>, since: Date, callback: @escaping (Int) -> Void) {
|
||||
|
||||
articlesTable.fetchUnreadCount(feeds, since, callback)
|
||||
articlesTable.fetchUnreadCount(feedIDs, since, callback)
|
||||
}
|
||||
|
||||
public func fetchStarredAndUnreadCount(for feeds: Set<Feed>, callback: @escaping (Int) -> Void) {
|
||||
public func fetchStarredAndUnreadCount(for feedIDs: Set<String>, callback: @escaping (Int) -> Void) {
|
||||
|
||||
articlesTable.fetchStarredAndUnreadCount(feeds, callback)
|
||||
articlesTable.fetchStarredAndUnreadCount(feedIDs, callback)
|
||||
}
|
||||
|
||||
public func fetchAllNonZeroUnreadCounts(_ completion: @escaping UnreadCountCompletionBlock) {
|
||||
@ -91,9 +91,9 @@ public final class Database {
|
||||
|
||||
// MARK: - Saving and Updating Articles
|
||||
|
||||
public func update(feed: Feed, parsedFeed: ParsedFeed, completion: @escaping UpdateArticlesWithFeedCompletionBlock) {
|
||||
public func update(feedID: String, parsedFeed: ParsedFeed, completion: @escaping UpdateArticlesWithFeedCompletionBlock) {
|
||||
|
||||
return articlesTable.update(feed, parsedFeed, completion)
|
||||
return articlesTable.update(feedID, parsedFeed, completion)
|
||||
}
|
||||
|
||||
// MARK: - Status
|
@ -8,28 +8,27 @@
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
840405CF1F1A963700DF0296 /* AttachmentsTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840405CE1F1A963700DF0296 /* AttachmentsTable.swift */; };
|
||||
841D4D742106B59F00DD04E6 /* Articles.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841D4D732106B59F00DD04E6 /* Articles.framework */; };
|
||||
84288A001F6A3C4400395871 /* DatabaseObject+Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842889FF1F6A3C4400395871 /* DatabaseObject+Database.swift */; };
|
||||
84288A021F6A3D8000395871 /* RelatedObjectsMap+Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84288A011F6A3D8000395871 /* RelatedObjectsMap+Database.swift */; };
|
||||
843577161F744FC800F460AE /* DatabaseArticle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 843577151F744FC800F460AE /* DatabaseArticle.swift */; };
|
||||
843577221F749C6200F460AE /* ArticleChangesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 843577211F749C6200F460AE /* ArticleChangesTests.swift */; };
|
||||
843702C31F70D15D00B18807 /* ParsedArticle+Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 843702C21F70D15D00B18807 /* ParsedArticle+Database.swift */; };
|
||||
843CB9961F34174100EE6581 /* Author+Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F20F901F1810DD00D8E682 /* Author+Database.swift */; };
|
||||
844BEE411F0AB3AB004AB7CD /* Database.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 844BEE371F0AB3AA004AB7CD /* Database.framework */; };
|
||||
844BEE411F0AB3AB004AB7CD /* ArticlesDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 844BEE371F0AB3AA004AB7CD /* ArticlesDatabase.framework */; };
|
||||
844BEE461F0AB3AB004AB7CD /* DatabaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 844BEE451F0AB3AB004AB7CD /* DatabaseTests.swift */; };
|
||||
845580671F0AEBCD003CCFA1 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845580661F0AEBCD003CCFA1 /* Constants.swift */; };
|
||||
845580761F0AF670003CCFA1 /* Article+Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845580751F0AF670003CCFA1 /* Article+Database.swift */; };
|
||||
8455807A1F0AF67D003CCFA1 /* ArticleStatus+Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845580791F0AF67D003CCFA1 /* ArticleStatus+Database.swift */; };
|
||||
8455807C1F0C0DBD003CCFA1 /* Attachment+Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8455807B1F0C0DBD003CCFA1 /* Attachment+Database.swift */; };
|
||||
846146271F0ABC7B00870CB3 /* RSParser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 846146241F0ABC7400870CB3 /* RSParser.framework */; };
|
||||
846FB36B1F4A937B00EAB81D /* Feed+Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 846FB36A1F4A937B00EAB81D /* Feed+Database.swift */; };
|
||||
848AD2961F58A91E004FB0EC /* UnreadCountDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 848AD2951F58A91E004FB0EC /* UnreadCountDictionary.swift */; };
|
||||
84BB4BA21F119C5400858766 /* RSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84BB4B981F119C4900858766 /* RSCore.framework */; };
|
||||
84E156EA1F0AB80500F8CC05 /* Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E156E91F0AB80500F8CC05 /* Database.swift */; };
|
||||
848E3EB920FBCFD20004B7ED /* RSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 848E3EB820FBCFD20004B7ED /* RSCore.framework */; };
|
||||
848E3EBB20FBCFD80004B7ED /* RSParser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 848E3EBA20FBCFD80004B7ED /* RSParser.framework */; };
|
||||
848E3EBD20FBCFDE0004B7ED /* RSDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 848E3EBC20FBCFDE0004B7ED /* RSDatabase.framework */; };
|
||||
84E156EA1F0AB80500F8CC05 /* ArticlesDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E156E91F0AB80500F8CC05 /* ArticlesDatabase.swift */; };
|
||||
84E156EC1F0AB80E00F8CC05 /* ArticlesTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E156EB1F0AB80E00F8CC05 /* ArticlesTable.swift */; };
|
||||
84E156EE1F0AB81400F8CC05 /* StatusesTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E156ED1F0AB81400F8CC05 /* StatusesTable.swift */; };
|
||||
84E156F01F0AB81F00F8CC05 /* CreateStatements.sql in Resources */ = {isa = PBXBuildFile; fileRef = 84E156EF1F0AB81F00F8CC05 /* CreateStatements.sql */; };
|
||||
84E156FD1F0AB86100F8CC05 /* Data.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84E156F81F0AB83600F8CC05 /* Data.framework */; };
|
||||
84E1570C1F0AB8A500F8CC05 /* RSDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84E157071F0AB89B00F8CC05 /* RSDatabase.framework */; };
|
||||
84F20F8F1F180D8700D8E682 /* AuthorsTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F20F8E1F180D8700D8E682 /* AuthorsTable.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
@ -115,13 +114,14 @@
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
840405CE1F1A963700DF0296 /* AttachmentsTable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentsTable.swift; sourceTree = "<group>"; };
|
||||
841D4D732106B59F00DD04E6 /* Articles.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Articles.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
842889FF1F6A3C4400395871 /* DatabaseObject+Database.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DatabaseObject+Database.swift"; sourceTree = "<group>"; };
|
||||
84288A011F6A3D8000395871 /* RelatedObjectsMap+Database.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RelatedObjectsMap+Database.swift"; sourceTree = "<group>"; };
|
||||
843577151F744FC800F460AE /* DatabaseArticle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseArticle.swift; sourceTree = "<group>"; };
|
||||
843577211F749C6200F460AE /* ArticleChangesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleChangesTests.swift; sourceTree = "<group>"; };
|
||||
843702C21F70D15D00B18807 /* ParsedArticle+Database.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "ParsedArticle+Database.swift"; path = "Extensions/ParsedArticle+Database.swift"; sourceTree = "<group>"; };
|
||||
844BEE371F0AB3AA004AB7CD /* Database.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Database.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
844BEE401F0AB3AB004AB7CD /* DatabaseTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DatabaseTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
844BEE371F0AB3AA004AB7CD /* ArticlesDatabase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ArticlesDatabase.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
844BEE401F0AB3AB004AB7CD /* ArticlesDatabaseTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ArticlesDatabaseTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
844BEE451F0AB3AB004AB7CD /* DatabaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseTests.swift; sourceTree = "<group>"; };
|
||||
844BEE471F0AB3AB004AB7CD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
845580661F0AEBCD003CCFA1 /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
|
||||
@ -129,11 +129,13 @@
|
||||
845580791F0AF67D003CCFA1 /* ArticleStatus+Database.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "ArticleStatus+Database.swift"; path = "Extensions/ArticleStatus+Database.swift"; sourceTree = "<group>"; };
|
||||
8455807B1F0C0DBD003CCFA1 /* Attachment+Database.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Attachment+Database.swift"; path = "Extensions/Attachment+Database.swift"; sourceTree = "<group>"; };
|
||||
8461461E1F0ABC7300870CB3 /* RSParser.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSParser.xcodeproj; path = ../RSParser/RSParser.xcodeproj; sourceTree = "<group>"; };
|
||||
846FB36A1F4A937B00EAB81D /* Feed+Database.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "Feed+Database.swift"; path = "Extensions/Feed+Database.swift"; sourceTree = "<group>"; };
|
||||
848AD2951F58A91E004FB0EC /* UnreadCountDictionary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnreadCountDictionary.swift; sourceTree = "<group>"; };
|
||||
848E3EB820FBCFD20004B7ED /* RSCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RSCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
848E3EBA20FBCFD80004B7ED /* RSParser.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RSParser.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
848E3EBC20FBCFDE0004B7ED /* RSDatabase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RSDatabase.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
84BB4B8F1F119C4900858766 /* RSCore.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSCore.xcodeproj; path = ../RSCore/RSCore.xcodeproj; sourceTree = "<group>"; };
|
||||
84E156E81F0AB75600F8CC05 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
84E156E91F0AB80500F8CC05 /* Database.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Database.swift; sourceTree = "<group>"; };
|
||||
84E156E91F0AB80500F8CC05 /* ArticlesDatabase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ArticlesDatabase.swift; sourceTree = "<group>"; };
|
||||
84E156EB1F0AB80E00F8CC05 /* ArticlesTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ArticlesTable.swift; sourceTree = "<group>"; };
|
||||
84E156ED1F0AB81400F8CC05 /* StatusesTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusesTable.swift; sourceTree = "<group>"; };
|
||||
84E156EF1F0AB81F00F8CC05 /* CreateStatements.sql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CreateStatements.sql; sourceTree = "<group>"; };
|
||||
@ -141,11 +143,11 @@
|
||||
84E157001F0AB89B00F8CC05 /* RSDatabase.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSDatabase.xcodeproj; path = ../RSDatabase/RSDatabase.xcodeproj; sourceTree = "<group>"; };
|
||||
84F20F8E1F180D8700D8E682 /* AuthorsTable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthorsTable.swift; sourceTree = "<group>"; };
|
||||
84F20F901F1810DD00D8E682 /* Author+Database.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "Author+Database.swift"; path = "Extensions/Author+Database.swift"; sourceTree = "<group>"; };
|
||||
D511EEE720242E0800712EC3 /* DatabaseTests_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DatabaseTests_target.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE820242E0800712EC3 /* Database_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Database_target.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE920242E0800712EC3 /* Database_project.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Database_project.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEEA20242E0800712EC3 /* Database_project_debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Database_project_debug.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEEB20242E0800712EC3 /* Database_project_release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Database_project_release.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE720242E0800712EC3 /* ArticlesDatabaseTests_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ArticlesDatabaseTests_target.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE820242E0800712EC3 /* ArticlesDatabase_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ArticlesDatabase_target.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEE920242E0800712EC3 /* ArticlesDatabase_project.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ArticlesDatabase_project.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEEA20242E0800712EC3 /* ArticlesDatabase_project_debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ArticlesDatabase_project_debug.xcconfig; sourceTree = "<group>"; };
|
||||
D511EEEB20242E0800712EC3 /* ArticlesDatabase_project_release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ArticlesDatabase_project_release.xcconfig; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -153,10 +155,10 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
84BB4BA21F119C5400858766 /* RSCore.framework in Frameworks */,
|
||||
846146271F0ABC7B00870CB3 /* RSParser.framework in Frameworks */,
|
||||
84E1570C1F0AB8A500F8CC05 /* RSDatabase.framework in Frameworks */,
|
||||
84E156FD1F0AB86100F8CC05 /* Data.framework in Frameworks */,
|
||||
841D4D742106B59F00DD04E6 /* Articles.framework in Frameworks */,
|
||||
848E3EBD20FBCFDE0004B7ED /* RSDatabase.framework in Frameworks */,
|
||||
848E3EBB20FBCFD80004B7ED /* RSParser.framework in Frameworks */,
|
||||
848E3EB920FBCFD20004B7ED /* RSCore.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -164,7 +166,7 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
844BEE411F0AB3AB004AB7CD /* Database.framework in Frameworks */,
|
||||
844BEE411F0AB3AB004AB7CD /* ArticlesDatabase.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -174,7 +176,7 @@
|
||||
844BEE2D1F0AB3AA004AB7CD = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
84E156E91F0AB80500F8CC05 /* Database.swift */,
|
||||
84E156E91F0AB80500F8CC05 /* ArticlesDatabase.swift */,
|
||||
848AD2951F58A91E004FB0EC /* UnreadCountDictionary.swift */,
|
||||
845580661F0AEBCD003CCFA1 /* Constants.swift */,
|
||||
84E156EB1F0AB80E00F8CC05 /* ArticlesTable.swift */,
|
||||
@ -195,8 +197,8 @@
|
||||
844BEE381F0AB3AA004AB7CD /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
844BEE371F0AB3AA004AB7CD /* Database.framework */,
|
||||
844BEE401F0AB3AB004AB7CD /* DatabaseTests.xctest */,
|
||||
844BEE371F0AB3AA004AB7CD /* ArticlesDatabase.framework */,
|
||||
844BEE401F0AB3AB004AB7CD /* ArticlesDatabaseTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
@ -223,7 +225,6 @@
|
||||
8461462A1F0AC44100870CB3 /* Extensions */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
846FB36A1F4A937B00EAB81D /* Feed+Database.swift */,
|
||||
845580751F0AF670003CCFA1 /* Article+Database.swift */,
|
||||
843702C21F70D15D00B18807 /* ParsedArticle+Database.swift */,
|
||||
845580791F0AF67D003CCFA1 /* ArticleStatus+Database.swift */,
|
||||
@ -257,6 +258,10 @@
|
||||
84E156FB1F0AB83A00F8CC05 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
841D4D732106B59F00DD04E6 /* Articles.framework */,
|
||||
848E3EBC20FBCFDE0004B7ED /* RSDatabase.framework */,
|
||||
848E3EBA20FBCFD80004B7ED /* RSParser.framework */,
|
||||
848E3EB820FBCFD20004B7ED /* RSCore.framework */,
|
||||
84E156F11F0AB83600F8CC05 /* Data.xcodeproj */,
|
||||
84E157001F0AB89B00F8CC05 /* RSDatabase.xcodeproj */,
|
||||
84BB4B8F1F119C4900858766 /* RSCore.xcodeproj */,
|
||||
@ -278,11 +283,11 @@
|
||||
D511EEE620242E0800712EC3 /* xcconfig */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D511EEE720242E0800712EC3 /* DatabaseTests_target.xcconfig */,
|
||||
D511EEE820242E0800712EC3 /* Database_target.xcconfig */,
|
||||
D511EEE920242E0800712EC3 /* Database_project.xcconfig */,
|
||||
D511EEEA20242E0800712EC3 /* Database_project_debug.xcconfig */,
|
||||
D511EEEB20242E0800712EC3 /* Database_project_release.xcconfig */,
|
||||
D511EEE720242E0800712EC3 /* ArticlesDatabaseTests_target.xcconfig */,
|
||||
D511EEE820242E0800712EC3 /* ArticlesDatabase_target.xcconfig */,
|
||||
D511EEE920242E0800712EC3 /* ArticlesDatabase_project.xcconfig */,
|
||||
D511EEEA20242E0800712EC3 /* ArticlesDatabase_project_debug.xcconfig */,
|
||||
D511EEEB20242E0800712EC3 /* ArticlesDatabase_project_release.xcconfig */,
|
||||
);
|
||||
path = xcconfig;
|
||||
sourceTree = "<group>";
|
||||
@ -300,9 +305,9 @@
|
||||
/* End PBXHeadersBuildPhase section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
844BEE361F0AB3AA004AB7CD /* Database */ = {
|
||||
844BEE361F0AB3AA004AB7CD /* ArticlesDatabase */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 844BEE4B1F0AB3AB004AB7CD /* Build configuration list for PBXNativeTarget "Database" */;
|
||||
buildConfigurationList = 844BEE4B1F0AB3AB004AB7CD /* Build configuration list for PBXNativeTarget "ArticlesDatabase" */;
|
||||
buildPhases = (
|
||||
844BEE321F0AB3AA004AB7CD /* Sources */,
|
||||
844BEE331F0AB3AA004AB7CD /* Frameworks */,
|
||||
@ -313,14 +318,14 @@
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = Database;
|
||||
name = ArticlesDatabase;
|
||||
productName = Database;
|
||||
productReference = 844BEE371F0AB3AA004AB7CD /* Database.framework */;
|
||||
productReference = 844BEE371F0AB3AA004AB7CD /* ArticlesDatabase.framework */;
|
||||
productType = "com.apple.product-type.framework";
|
||||
};
|
||||
844BEE3F1F0AB3AB004AB7CD /* DatabaseTests */ = {
|
||||
844BEE3F1F0AB3AB004AB7CD /* ArticlesDatabaseTests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 844BEE4E1F0AB3AB004AB7CD /* Build configuration list for PBXNativeTarget "DatabaseTests" */;
|
||||
buildConfigurationList = 844BEE4E1F0AB3AB004AB7CD /* Build configuration list for PBXNativeTarget "ArticlesDatabaseTests" */;
|
||||
buildPhases = (
|
||||
844BEE3C1F0AB3AB004AB7CD /* Sources */,
|
||||
844BEE3D1F0AB3AB004AB7CD /* Frameworks */,
|
||||
@ -331,9 +336,9 @@
|
||||
dependencies = (
|
||||
844BEE431F0AB3AB004AB7CD /* PBXTargetDependency */,
|
||||
);
|
||||
name = DatabaseTests;
|
||||
name = ArticlesDatabaseTests;
|
||||
productName = DatabaseTests;
|
||||
productReference = 844BEE401F0AB3AB004AB7CD /* DatabaseTests.xctest */;
|
||||
productReference = 844BEE401F0AB3AB004AB7CD /* ArticlesDatabaseTests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.unit-test";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
@ -359,7 +364,7 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 844BEE311F0AB3AA004AB7CD /* Build configuration list for PBXProject "Database" */;
|
||||
buildConfigurationList = 844BEE311F0AB3AA004AB7CD /* Build configuration list for PBXProject "ArticlesDatabase" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
@ -389,8 +394,8 @@
|
||||
);
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
844BEE361F0AB3AA004AB7CD /* Database */,
|
||||
844BEE3F1F0AB3AB004AB7CD /* DatabaseTests */,
|
||||
844BEE361F0AB3AA004AB7CD /* ArticlesDatabase */,
|
||||
844BEE3F1F0AB3AB004AB7CD /* ArticlesDatabaseTests */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
@ -492,7 +497,6 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
845580671F0AEBCD003CCFA1 /* Constants.swift in Sources */,
|
||||
846FB36B1F4A937B00EAB81D /* Feed+Database.swift in Sources */,
|
||||
843CB9961F34174100EE6581 /* Author+Database.swift in Sources */,
|
||||
848AD2961F58A91E004FB0EC /* UnreadCountDictionary.swift in Sources */,
|
||||
845580761F0AF670003CCFA1 /* Article+Database.swift in Sources */,
|
||||
@ -506,7 +510,7 @@
|
||||
843702C31F70D15D00B18807 /* ParsedArticle+Database.swift in Sources */,
|
||||
84E156EC1F0AB80E00F8CC05 /* ArticlesTable.swift in Sources */,
|
||||
84E156EE1F0AB81400F8CC05 /* StatusesTable.swift in Sources */,
|
||||
84E156EA1F0AB80500F8CC05 /* Database.swift in Sources */,
|
||||
84E156EA1F0AB80500F8CC05 /* ArticlesDatabase.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -524,7 +528,7 @@
|
||||
/* Begin PBXTargetDependency section */
|
||||
844BEE431F0AB3AB004AB7CD /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 844BEE361F0AB3AA004AB7CD /* Database */;
|
||||
target = 844BEE361F0AB3AA004AB7CD /* ArticlesDatabase */;
|
||||
targetProxy = 844BEE421F0AB3AB004AB7CD /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
@ -532,7 +536,7 @@
|
||||
/* Begin XCBuildConfiguration section */
|
||||
844BEE491F0AB3AB004AB7CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D511EEEA20242E0800712EC3 /* Database_project_debug.xcconfig */;
|
||||
baseConfigurationReference = D511EEEA20242E0800712EC3 /* ArticlesDatabase_project_debug.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
SWIFT_SWIFT3_OBJC_INFERENCE = Off;
|
||||
@ -541,7 +545,7 @@
|
||||
};
|
||||
844BEE4A1F0AB3AB004AB7CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D511EEEB20242E0800712EC3 /* Database_project_release.xcconfig */;
|
||||
baseConfigurationReference = D511EEEB20242E0800712EC3 /* ArticlesDatabase_project_release.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
SWIFT_SWIFT3_OBJC_INFERENCE = Off;
|
||||
@ -550,36 +554,42 @@
|
||||
};
|
||||
844BEE4C1F0AB3AB004AB7CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D511EEE820242E0800712EC3 /* Database_target.xcconfig */;
|
||||
baseConfigurationReference = D511EEE820242E0800712EC3 /* ArticlesDatabase_target.xcconfig */;
|
||||
buildSettings = {
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.ranchero.ArticlesDatabase;
|
||||
PRODUCT_NAME = ArticlesDatabase;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
844BEE4D1F0AB3AB004AB7CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D511EEE820242E0800712EC3 /* Database_target.xcconfig */;
|
||||
baseConfigurationReference = D511EEE820242E0800712EC3 /* ArticlesDatabase_target.xcconfig */;
|
||||
buildSettings = {
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.ranchero.ArticlesDatabase;
|
||||
PRODUCT_NAME = ArticlesDatabase;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
844BEE4F1F0AB3AB004AB7CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D511EEE720242E0800712EC3 /* DatabaseTests_target.xcconfig */;
|
||||
baseConfigurationReference = D511EEE720242E0800712EC3 /* ArticlesDatabaseTests_target.xcconfig */;
|
||||
buildSettings = {
|
||||
PRODUCT_NAME = ArticlesDatabaseTests;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
844BEE501F0AB3AB004AB7CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D511EEE720242E0800712EC3 /* DatabaseTests_target.xcconfig */;
|
||||
baseConfigurationReference = D511EEE720242E0800712EC3 /* ArticlesDatabaseTests_target.xcconfig */;
|
||||
buildSettings = {
|
||||
PRODUCT_NAME = ArticlesDatabaseTests;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
844BEE311F0AB3AA004AB7CD /* Build configuration list for PBXProject "Database" */ = {
|
||||
844BEE311F0AB3AA004AB7CD /* Build configuration list for PBXProject "ArticlesDatabase" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
844BEE491F0AB3AB004AB7CD /* Debug */,
|
||||
@ -588,7 +598,7 @@
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
844BEE4B1F0AB3AB004AB7CD /* Build configuration list for PBXNativeTarget "Database" */ = {
|
||||
844BEE4B1F0AB3AB004AB7CD /* Build configuration list for PBXNativeTarget "ArticlesDatabase" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
844BEE4C1F0AB3AB004AB7CD /* Debug */,
|
||||
@ -597,7 +607,7 @@
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
844BEE4E1F0AB3AB004AB7CD /* Build configuration list for PBXNativeTarget "DatabaseTests" */ = {
|
||||
844BEE4E1F0AB3AB004AB7CD /* Build configuration list for PBXNativeTarget "ArticlesDatabaseTests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
844BEE4F1F0AB3AB004AB7CD /* Debug */,
|
@ -10,7 +10,7 @@ import Foundation
|
||||
import RSCore
|
||||
import RSDatabase
|
||||
import RSParser
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
final class ArticlesTable: DatabaseTable {
|
||||
|
||||
@ -41,9 +41,8 @@ final class ArticlesTable: DatabaseTable {
|
||||
|
||||
// MARK: Fetching
|
||||
|
||||
func fetchArticles(_ feed: Feed) -> Set<Article> {
|
||||
func fetchArticles(_ feedID: String) -> Set<Article> {
|
||||
|
||||
let feedID = feed.feedID
|
||||
var articles = Set<Article>()
|
||||
|
||||
queue.fetchSync { (database) in
|
||||
@ -53,9 +52,7 @@ final class ArticlesTable: DatabaseTable {
|
||||
return articles
|
||||
}
|
||||
|
||||
func fetchArticlesAsync(_ feed: Feed, withLimits: Bool, _ resultBlock: @escaping ArticleResultBlock) {
|
||||
|
||||
let feedID = feed.feedID
|
||||
func fetchArticlesAsync(_ feedID: String, withLimits: Bool, _ resultBlock: @escaping ArticleResultBlock) {
|
||||
|
||||
queue.fetch { (database) in
|
||||
|
||||
@ -67,24 +64,24 @@ final class ArticlesTable: DatabaseTable {
|
||||
}
|
||||
}
|
||||
|
||||
func fetchUnreadArticles(for feeds: Set<Feed>) -> Set<Article> {
|
||||
func fetchUnreadArticles(for feedIDs: Set<String>) -> Set<Article> {
|
||||
|
||||
return fetchUnreadArticles(feeds.feedIDs())
|
||||
return fetchUnreadArticles(feedIDs)
|
||||
}
|
||||
|
||||
public func fetchTodayArticles(for feeds: Set<Feed>) -> Set<Article> {
|
||||
public func fetchTodayArticles(for feedIDs: Set<String>) -> Set<Article> {
|
||||
|
||||
return fetchTodayArticles(feeds.feedIDs())
|
||||
return fetchTodayArticles(feedIDs)
|
||||
}
|
||||
|
||||
public func fetchStarredArticles(for feeds: Set<Feed>) -> Set<Article> {
|
||||
public func fetchStarredArticles(for feedIDs: Set<String>) -> Set<Article> {
|
||||
|
||||
return fetchStarredArticles(feeds.feedIDs())
|
||||
return fetchStarredArticles(feedIDs)
|
||||
}
|
||||
|
||||
// MARK: Updating
|
||||
|
||||
func update(_ feed: Feed, _ parsedFeed: ParsedFeed, _ completion: @escaping UpdateArticlesWithFeedCompletionBlock) {
|
||||
func update(_ feedID: String, _ parsedFeed: ParsedFeed, _ completion: @escaping UpdateArticlesWithFeedCompletionBlock) {
|
||||
|
||||
if parsedFeed.items.isEmpty {
|
||||
completion(nil, nil)
|
||||
@ -99,7 +96,6 @@ final class ArticlesTable: DatabaseTable {
|
||||
// 6. Create array of updated Articles and save what’s changed.
|
||||
// 7. Call back with new and updated Articles.
|
||||
|
||||
let feedID = feed.feedID
|
||||
let articleIDs = Set(parsedFeed.items.map { $0.articleID })
|
||||
|
||||
self.queue.update { (database) in
|
||||
@ -131,14 +127,13 @@ final class ArticlesTable: DatabaseTable {
|
||||
|
||||
// MARK: Unread Counts
|
||||
|
||||
func fetchUnreadCounts(_ feeds: Set<Feed>, _ completion: @escaping UnreadCountCompletionBlock) {
|
||||
func fetchUnreadCounts(_ feedIDs: Set<String>, _ completion: @escaping UnreadCountCompletionBlock) {
|
||||
|
||||
if feeds.isEmpty {
|
||||
if feedIDs.isEmpty {
|
||||
completion(UnreadCountDictionary())
|
||||
return
|
||||
}
|
||||
|
||||
let feedIDs = feeds.feedIDs()
|
||||
var unreadCountDictionary = UnreadCountDictionary()
|
||||
|
||||
queue.fetch { (database) in
|
||||
@ -153,16 +148,15 @@ final class ArticlesTable: DatabaseTable {
|
||||
}
|
||||
}
|
||||
|
||||
func fetchUnreadCount(_ feeds: Set<Feed>, _ since: Date, _ callback: @escaping (Int) -> Void) {
|
||||
func fetchUnreadCount(_ feedIDs: Set<String>, _ since: Date, _ callback: @escaping (Int) -> Void) {
|
||||
|
||||
// Get unread count for today, for instance.
|
||||
|
||||
if feeds.isEmpty {
|
||||
if feedIDs.isEmpty {
|
||||
callback(0)
|
||||
return
|
||||
}
|
||||
|
||||
let feedIDs = feeds.feedIDs()
|
||||
queue.fetch { (database) in
|
||||
|
||||
let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(feedIDs.count))!
|
||||
@ -211,14 +205,13 @@ final class ArticlesTable: DatabaseTable {
|
||||
}
|
||||
}
|
||||
|
||||
func fetchStarredAndUnreadCount(_ feeds: Set<Feed>, _ callback: @escaping (Int) -> Void) {
|
||||
func fetchStarredAndUnreadCount(_ feedIDs: Set<String>, _ callback: @escaping (Int) -> Void) {
|
||||
|
||||
if feeds.isEmpty {
|
||||
if feedIDs.isEmpty {
|
||||
callback(0)
|
||||
return
|
||||
}
|
||||
|
||||
let feedIDs = feeds.feedIDs()
|
||||
queue.fetch { (database) in
|
||||
|
||||
let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(feedIDs.count))!
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import RSDatabase
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
final class AttachmentsTable: DatabaseRelatedObjectsTable {
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import RSDatabase
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
// article->authors is a many-to-many relationship.
|
||||
// There’s a lookup table relating authorID and articleID.
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
// Intermediate representation of an Article. Doesn’t include related objects.
|
||||
// Used by ArticlesTable as part of fetching articles.
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import RSDatabase
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
extension Array where Element == DatabaseObject {
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import Database
|
||||
@testable import ArticlesDatabase
|
||||
|
||||
class ArticleChangesTests: XCTestCase {
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import Database
|
||||
@testable import ArticlesDatabase
|
||||
|
||||
class DatabaseTests: XCTestCase {
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import RSDatabase
|
||||
import Data
|
||||
import Articles
|
||||
import RSParser
|
||||
|
||||
extension Article {
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
import RSDatabase
|
||||
import Data
|
||||
import Articles
|
||||
|
||||
extension ArticleStatus {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user