Merge branch 'master' of https://github.com/brentsimmons/Evergreen into safari-extension

# Conflicts:
#	Evergreen.xcodeproj/project.pbxproj
This commit is contained in:
Daniel Jalkut 2018-08-19 12:29:44 -04:00
commit 3492b59707
155 changed files with 1089 additions and 6360 deletions

18
.gitmodules vendored Normal file
View 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

View File

@ -10,7 +10,7 @@ import Foundation
import RSCore
import RSTree
import Account
import Data
import Articles
final class DeleteFromSidebarCommand: UndoableCommand {

View File

@ -8,7 +8,7 @@
import Foundation
import RSCore
import Data
import Articles
// Mark articles read/unread, starred/unstarred, deleted/undeleted.

View File

@ -8,7 +8,7 @@
import AppKit
import RSCore
import Data
import Articles
final class SendToMarsEditCommand: SendToCommand {

View File

@ -7,7 +7,7 @@
//
import AppKit
import Data
import Articles
import RSCore
// Not undoable.

View File

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

View File

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

View File

@ -7,7 +7,7 @@
//
import AppKit
import Data
import Articles
extension Notification.Name {

View File

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

View File

@ -7,7 +7,7 @@
//
import Foundation
import Data
import Articles
import Account
// These handle multiple accounts.

View File

@ -7,7 +7,7 @@
//
import AppKit
import Data
import Articles
import Account
protocol SmallIconProvider {

View File

@ -8,7 +8,7 @@
import Foundation
import RSTree
import Data
import Articles
import RSCore
extension Array where Element == Node {

View File

@ -7,7 +7,8 @@
//
import AppKit
import Data
import Articles
import Account
import RSCore
extension Notification.Name {

View File

@ -1,6 +1,6 @@
//
// FeedFinder.swift
// RSFeedFinder
// FeedFinder
//
// Created by Brent Simmons on 8/2/16.
// Copyright © 2016 Ranchero Software, LLC. All rights reserved.

View File

@ -1,6 +1,6 @@
//
// FeedSpecifier.swift
// RSFeedFinder
// FeedFinder
//
// Created by Brent Simmons on 8/7/16.
// Copyright © 2016 Ranchero Software, LLC. All rights reserved.

View File

@ -1,6 +1,6 @@
//
// HTMLFeedFinder.swift
// RSFeedFinder
// FeedFinder
//
// Created by Brent Simmons on 8/7/16.
// Copyright © 2016 Ranchero Software, LLC. All rights reserved.

View File

@ -8,7 +8,7 @@
import Foundation
import RSCore
import Data
import Articles
final class FeedListFolder: Hashable, DisplayNameProvider {

View File

@ -7,7 +7,7 @@
//
import AppKit
import Data
import Articles
extension Notification.Name {

View File

@ -7,7 +7,7 @@
//
import AppKit
import Data
import Articles
import RSParser
final class FeaturedImageDownloader {

View File

@ -7,7 +7,8 @@
//
import AppKit
import Data
import Articles
import Account
import RSWeb
import RSParser

View File

@ -7,7 +7,8 @@
//
import AppKit
import Data
import Articles
import Account
import DB5
final class FeedInspectorViewController: NSViewController, Inspector {

View File

@ -9,8 +9,7 @@
import AppKit
import RSCore
import RSTree
import Data
import RSFeedFinder
import Articles
import Account
import RSParser

View File

@ -9,7 +9,7 @@
import AppKit
import RSCore
import RSTree
import Data
import Articles
import Account
protocol AddFeedWindowControllerDelegate: class {

View File

@ -9,7 +9,7 @@
import Foundation
import RSCore
import RSTree
import Data
import Articles
import Account
final class FolderTreeControllerDelegate: TreeControllerDelegate {

View File

@ -7,7 +7,7 @@
//
import AppKit
import Data
import Articles
import Account
class AddFolderWindowController : NSWindowController {

View File

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

View File

@ -8,7 +8,7 @@
import AppKit
import DB5
import Data
import Articles
final class DetailStatusBarView: NSView {

View File

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

View File

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

View File

@ -7,7 +7,7 @@
//
import AppKit
import Data
import Articles
import Account
import RSCore

View File

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

View File

@ -7,7 +7,8 @@
//
import AppKit
import Data
import Articles
import Account
import RSCore
extension Feed: PasteboardWriterOwner {

View File

@ -8,7 +8,7 @@
import AppKit
import RSTree
import Data
import Articles
import RSCore
@objc final class SidebarOutlineDataSource: NSObject, NSOutlineViewDataSource {

View File

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

View File

@ -8,7 +8,7 @@
import Foundation
import RSTree
import Data
import Articles
import Account
final class SidebarTreeControllerDelegate: TreeControllerDelegate {

View File

@ -7,7 +7,7 @@
//
import AppKit
import Data
import Articles
import Account
import RSCore

View File

@ -8,7 +8,7 @@
import AppKit
import RSTree
import Data
import Articles
import Account
import RSCore

View File

@ -7,7 +7,7 @@
//
import Foundation
import Data
import Articles
typealias ArticleArray = [Article]

View File

@ -7,7 +7,7 @@
//
import AppKit
import Data
import Articles
import RSCore
extension Article: PasteboardWriterOwner {

View File

@ -7,7 +7,7 @@
//
import AppKit
import Data
import Articles
struct TimelineCellData {

View File

@ -7,7 +7,7 @@
//
import Foundation
import Data
import Articles
import RSParser
// TODO: Dont make all this at top level.

View File

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

View File

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

View File

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

View File

@ -7,7 +7,7 @@
//
import AppKit
import Data
import Articles
import Account
extension TimelineViewController {

View File

@ -8,7 +8,7 @@
import Foundation
import RSCore
import Data
import Articles
import Account
class TimelineViewController: NSViewController, UndoableCommandRunner {

View File

@ -8,7 +8,7 @@
import AppKit
import Account
import Data
import Articles
import RSCore
@objc(ScriptableAccount)

View File

@ -17,7 +17,7 @@
*/
import Foundation
import Data
import Articles
protocol AppDelegateAppleEvents {
func installAppleEventHandlers()

View File

@ -8,7 +8,7 @@
import Foundation
import Account
import Data
import Articles
@objc(ScriptableArticle)
class ScriptableArticle: NSObject, UniqueIdScriptingObject, ScriptingObjectContainer {

View File

@ -8,7 +8,7 @@
import Foundation
import Account
import Data
import Articles
@objc(ScriptableAuthor)
class ScriptableAuthor: NSObject, UniqueIdScriptingObject {

View File

@ -9,7 +9,7 @@
import Foundation
import RSParser
import Account
import Data
import Articles
@objc(ScriptableFeed)
class ScriptableFeed: NSObject, UniqueIdScriptingObject, ScriptingObjectContainer{

View File

@ -8,7 +8,7 @@
import Foundation
import Account
import Data
import Articles
import RSCore
@objc(ScriptableFolder)

View File

@ -7,7 +7,7 @@
//
import Foundation
import Data
import Articles
protocol ScriptingMainWindowController {
var scriptingCurrentArticle: Article? { get }

View File

@ -8,7 +8,7 @@
import AppKit
import Account
import Data
import Articles
extension NSApplication : ScriptingObjectContainer {

View File

@ -7,7 +7,8 @@
//
import Foundation
import Data
import Articles
import Account
import RSCore
protocol PseudoFeed: class, DisplayNameProvider, UnreadCountProvider, SmallIconProvider, PasteboardWriterOwner {

View File

@ -8,7 +8,7 @@
import Foundation
import RSCore
import Data
import Articles
import Account
protocol SmartFeedDelegate: DisplayNameProvider, ArticleFetcher {

View File

@ -7,7 +7,7 @@
//
import Foundation
import Data
import Articles
import Account

View File

@ -7,7 +7,7 @@
//
import Foundation
import Data
import Articles
import Account
struct TodayFeedDelegate: SmartFeedDelegate {

View File

@ -8,7 +8,7 @@
import AppKit
import Account
import Data
import Articles
// This just shows the global unread count, which appDelegate already has. Easy.

View File

@ -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 wont appear in unreadCountDictionary.
if let unreadCount = unreadCountDictionary[feed] {
if let unreadCount = unreadCountDictionary[feed.feedID] {
feed.unreadCount = unreadCount
}
else {

View File

@ -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 */,
);

View File

@ -8,7 +8,7 @@
import Foundation
import RSCore
import Data
import Articles
let AccountsDidChangeNotification = "AccountsDidChangeNotification"

View File

@ -7,7 +7,7 @@
//
import Foundation
import Data
import Articles
public protocol ArticleFetcher {

View File

@ -9,7 +9,7 @@
import Foundation
import RSCore
import Data
import Articles
extension Notification.Name {

View File

@ -7,7 +7,7 @@
//
import Foundation
import Data
import Articles
import RSParser
public extension Notification.Name {

View File

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

View File

@ -7,7 +7,7 @@
//
import Foundation
import Data
import Articles
import RSCore
public final class Folder: DisplayNameProvider, Container, UnreadCountProvider, Hashable {

View File

@ -10,7 +10,7 @@ import Foundation
import RSCore
import RSParser
import RSWeb
import Data
import Articles
final class LocalAccountRefresher {

View File

@ -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 */,

View File

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

View File

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

View File

@ -7,7 +7,7 @@
//
import XCTest
@testable import Data
@testable import Articles
class DataTests: XCTestCase {

View File

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

View File

@ -1,4 +1,4 @@
#include "./Database_project.xcconfig"
#include "./ArticlesData_project.xcconfig"
DEBUG_INFORMATION_FORMAT = dwarf
ENABLE_TESTABILITY = YES

View File

@ -1,4 +1,4 @@
#include "./RSFeedFinder_project.xcconfig"
#include "./ArticlesData_project.xcconfig"
DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
ENABLE_NS_ASSERTIONS = NO

View File

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

View File

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

View File

@ -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 */,

View File

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

View File

@ -8,7 +8,7 @@
import Foundation
import RSDatabase
import Data
import Articles
final class AttachmentsTable: DatabaseRelatedObjectsTable {

View File

@ -8,7 +8,7 @@
import Foundation
import RSDatabase
import Data
import Articles
// article->authors is a many-to-many relationship.
// Theres a lookup table relating authorID and articleID.

View File

@ -7,7 +7,7 @@
//
import Foundation
import Data
import Articles
// Intermediate representation of an Article. Doesnt include related objects.
// Used by ArticlesTable as part of fetching articles.

View File

@ -8,7 +8,7 @@
import Foundation
import RSDatabase
import Data
import Articles
extension Array where Element == DatabaseObject {

View File

@ -7,7 +7,7 @@
//
import XCTest
@testable import Database
@testable import ArticlesDatabase
class ArticleChangesTests: XCTestCase {

View File

@ -7,7 +7,7 @@
//
import XCTest
@testable import Database
@testable import ArticlesDatabase
class DatabaseTests: XCTestCase {

View File

@ -8,7 +8,7 @@
import Foundation
import RSDatabase
import Data
import Articles
import RSParser
extension Article {

View File

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