diff --git a/Appcasts/evergreen-beta.xml b/Appcasts/evergreen-beta.xml index 5af72ee22..c216a76d6 100755 --- a/Appcasts/evergreen-beta.xml +++ b/Appcasts/evergreen-beta.xml @@ -6,6 +6,28 @@ Most recent Evergreen changes with links to updates. en + + Evergreen 1.0d35 + Sidebar Gear Menu +

You can rename, mark as read, and copy URLs.

+

(Delete isn’t there yet, but it’s planned for 1.0.)

+ +

Misc.

+

You can sort the timeline by newest on top or oldest on top. See the View > Sort By menu.

+

Share menu now supports EagleFiler Impot and Add to Reading List. (Thanks to a contribution by Michael Tsai.)

+

Go > Today, Unread, Starred commands work, including keyboard shortcuts. (Nothing appears yet, though. That’s a separate bug.)

+

Fixed a bug where the add-feed command wouldn’t disable when a sheet was already displaying.

+

Removed Debug menu when running a Release build.

+

Punted multiple window support till after 1.0.

+ + ]]>
+ Sun, 04 Feb 2018 12:00:00 -0800 + + 10.13 +
+ Evergreen 1.0d34 "; }; - 84E3B1632025877000E03C2F /* MasterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MasterViewController.swift; sourceTree = ""; }; - 84E3B1652025877000E03C2F /* DetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; - 84E3B1682025877000E03C2F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 84E3B16A2025877000E03C2F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 84E3B16D2025877000E03C2F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 84E3B16F2025877000E03C2F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 84E3B1742025877000E03C2F /* Evergreen-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Evergreen-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 84E3B1782025877000E03C2F /* Evergreen_iOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Evergreen_iOSTests.swift; sourceTree = ""; }; - 84E3B17A2025877000E03C2F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 84E3B15B2025877000E03C2F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 84E3B1712025877000E03C2F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 84E3B1552025877000E03C2F = { - isa = PBXGroup; - children = ( - 84E3B1602025877000E03C2F /* Evergreen-iOS */, - 84E3B1772025877000E03C2F /* Evergreen-iOSTests */, - 84E3B15F2025877000E03C2F /* Products */, - ); - sourceTree = ""; - }; - 84E3B15F2025877000E03C2F /* Products */ = { - isa = PBXGroup; - children = ( - 84E3B15E2025877000E03C2F /* Evergreen-iOS.app */, - 84E3B1742025877000E03C2F /* Evergreen-iOSTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 84E3B1602025877000E03C2F /* Evergreen-iOS */ = { - isa = PBXGroup; - children = ( - 84E3B1612025877000E03C2F /* AppDelegate.swift */, - 84E3B1632025877000E03C2F /* MasterViewController.swift */, - 84E3B1652025877000E03C2F /* DetailViewController.swift */, - 84E3B1672025877000E03C2F /* Main.storyboard */, - 84E3B16A2025877000E03C2F /* Assets.xcassets */, - 84E3B16C2025877000E03C2F /* LaunchScreen.storyboard */, - 84E3B16F2025877000E03C2F /* Info.plist */, - ); - path = "Evergreen-iOS"; - sourceTree = ""; - }; - 84E3B1772025877000E03C2F /* Evergreen-iOSTests */ = { - isa = PBXGroup; - children = ( - 84E3B1782025877000E03C2F /* Evergreen_iOSTests.swift */, - 84E3B17A2025877000E03C2F /* Info.plist */, - ); - path = "Evergreen-iOSTests"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 84E3B15D2025877000E03C2F /* Evergreen-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 84E3B17D2025877000E03C2F /* Build configuration list for PBXNativeTarget "Evergreen-iOS" */; - buildPhases = ( - 84E3B15A2025877000E03C2F /* Sources */, - 84E3B15B2025877000E03C2F /* Frameworks */, - 84E3B15C2025877000E03C2F /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Evergreen-iOS"; - productName = "Evergreen-iOS"; - productReference = 84E3B15E2025877000E03C2F /* Evergreen-iOS.app */; - productType = "com.apple.product-type.application"; - }; - 84E3B1732025877000E03C2F /* Evergreen-iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 84E3B1802025877000E03C2F /* Build configuration list for PBXNativeTarget "Evergreen-iOSTests" */; - buildPhases = ( - 84E3B1702025877000E03C2F /* Sources */, - 84E3B1712025877000E03C2F /* Frameworks */, - 84E3B1722025877000E03C2F /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 84E3B1762025877000E03C2F /* PBXTargetDependency */, - ); - name = "Evergreen-iOSTests"; - productName = "Evergreen-iOSTests"; - productReference = 84E3B1742025877000E03C2F /* Evergreen-iOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 84E3B1562025877000E03C2F /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 0920; - ORGANIZATIONNAME = "Ranchero Software, LLC"; - TargetAttributes = { - 84E3B15D2025877000E03C2F = { - CreatedOnToolsVersion = 9.2; - ProvisioningStyle = Automatic; - }; - 84E3B1732025877000E03C2F = { - CreatedOnToolsVersion = 9.2; - ProvisioningStyle = Automatic; - TestTargetID = 84E3B15D2025877000E03C2F; - }; - }; - }; - buildConfigurationList = 84E3B1592025877000E03C2F /* Build configuration list for PBXProject "Evergreen-iOS" */; - compatibilityVersion = "Xcode 8.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 84E3B1552025877000E03C2F; - productRefGroup = 84E3B15F2025877000E03C2F /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 84E3B15D2025877000E03C2F /* Evergreen-iOS */, - 84E3B1732025877000E03C2F /* Evergreen-iOSTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 84E3B15C2025877000E03C2F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 84E3B16E2025877000E03C2F /* LaunchScreen.storyboard in Resources */, - 84E3B16B2025877000E03C2F /* Assets.xcassets in Resources */, - 84E3B1692025877000E03C2F /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 84E3B1722025877000E03C2F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 84E3B15A2025877000E03C2F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 84E3B1662025877000E03C2F /* DetailViewController.swift in Sources */, - 84E3B1642025877000E03C2F /* MasterViewController.swift in Sources */, - 84E3B1622025877000E03C2F /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 84E3B1702025877000E03C2F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 84E3B1792025877000E03C2F /* Evergreen_iOSTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 84E3B1762025877000E03C2F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 84E3B15D2025877000E03C2F /* Evergreen-iOS */; - targetProxy = 84E3B1752025877000E03C2F /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 84E3B1672025877000E03C2F /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 84E3B1682025877000E03C2F /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 84E3B16C2025877000E03C2F /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 84E3B16D2025877000E03C2F /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 84E3B17B2025877000E03C2F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 84E3B17C2025877000E03C2F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 84E3B17E2025877000E03C2F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = M8L2WTLA8W; - INFOPLIST_FILE = "Evergreen-iOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 84E3B17F2025877000E03C2F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = M8L2WTLA8W; - INFOPLIST_FILE = "Evergreen-iOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 84E3B1812025877000E03C2F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = M8L2WTLA8W; - INFOPLIST_FILE = "Evergreen-iOSTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Evergreen-iOS.app/Evergreen-iOS"; - }; - name = Debug; - }; - 84E3B1822025877000E03C2F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = M8L2WTLA8W; - INFOPLIST_FILE = "Evergreen-iOSTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Evergreen-iOS.app/Evergreen-iOS"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 84E3B1592025877000E03C2F /* Build configuration list for PBXProject "Evergreen-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 84E3B17B2025877000E03C2F /* Debug */, - 84E3B17C2025877000E03C2F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 84E3B17D2025877000E03C2F /* Build configuration list for PBXNativeTarget "Evergreen-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 84E3B17E2025877000E03C2F /* Debug */, - 84E3B17F2025877000E03C2F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 84E3B1802025877000E03C2F /* Build configuration list for PBXNativeTarget "Evergreen-iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 84E3B1812025877000E03C2F /* Debug */, - 84E3B1822025877000E03C2F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 84E3B1562025877000E03C2F /* Project object */; -} diff --git a/Evergreen-iOS/Evergreen-iOS/Info.plist b/Evergreen-iOS/Info.plist similarity index 98% rename from Evergreen-iOS/Evergreen-iOS/Info.plist rename to Evergreen-iOS/Info.plist index 6873106a5..1d6078905 100644 --- a/Evergreen-iOS/Evergreen-iOS/Info.plist +++ b/Evergreen-iOS/Info.plist @@ -26,7 +26,7 @@ Main UIRequiredDeviceCapabilities - armv7 + arm64 UIStatusBarTintParameters diff --git a/Evergreen-iOS/Evergreen-iOS/MasterViewController.swift b/Evergreen-iOS/MasterViewController.swift similarity index 96% rename from Evergreen-iOS/Evergreen-iOS/MasterViewController.swift rename to Evergreen-iOS/MasterViewController.swift index 50909abe9..8c49a2c90 100644 --- a/Evergreen-iOS/Evergreen-iOS/MasterViewController.swift +++ b/Evergreen-iOS/MasterViewController.swift @@ -2,8 +2,8 @@ // MasterViewController.swift // Evergreen-iOS // -// Created by Brent Simmons on 2/2/18. -// Copyright © 2018 Ranchero Software, LLC. All rights reserved. +// Created by Brent Simmons on 2/5/18. +// Copyright © 2018 Ranchero Software. All rights reserved. // import UIKit diff --git a/Evergreen-iOS/Evergreen-iOSTests/Evergreen_iOSTests.swift b/Evergreen-iOSTests/Evergreen_iOSTests.swift similarity index 89% rename from Evergreen-iOS/Evergreen-iOSTests/Evergreen_iOSTests.swift rename to Evergreen-iOSTests/Evergreen_iOSTests.swift index 48c872a6f..0cbcccfe8 100644 --- a/Evergreen-iOS/Evergreen-iOSTests/Evergreen_iOSTests.swift +++ b/Evergreen-iOSTests/Evergreen_iOSTests.swift @@ -2,8 +2,8 @@ // Evergreen_iOSTests.swift // Evergreen-iOSTests // -// Created by Brent Simmons on 2/2/18. -// Copyright © 2018 Ranchero Software, LLC. All rights reserved. +// Created by Brent Simmons on 2/5/18. +// Copyright © 2018 Ranchero Software. All rights reserved. // import XCTest diff --git a/Evergreen-iOS/Evergreen-iOSTests/Info.plist b/Evergreen-iOSTests/Info.plist similarity index 100% rename from Evergreen-iOS/Evergreen-iOSTests/Info.plist rename to Evergreen-iOSTests/Info.plist diff --git a/Evergreen-iOSUITests/Evergreen_iOSUITests.swift b/Evergreen-iOSUITests/Evergreen_iOSUITests.swift new file mode 100644 index 000000000..66023b2c1 --- /dev/null +++ b/Evergreen-iOSUITests/Evergreen_iOSUITests.swift @@ -0,0 +1,36 @@ +// +// Evergreen_iOSUITests.swift +// Evergreen-iOSUITests +// +// Created by Brent Simmons on 2/5/18. +// Copyright © 2018 Ranchero Software. All rights reserved. +// + +import XCTest + +class Evergreen_iOSUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/Evergreen-iOSUITests/Info.plist b/Evergreen-iOSUITests/Info.plist new file mode 100644 index 000000000..6c40a6cd0 --- /dev/null +++ b/Evergreen-iOSUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Evergreen.xcodeproj/project.pbxproj b/Evergreen.xcodeproj/project.pbxproj index 014a66093..6c6918fe6 100644 --- a/Evergreen.xcodeproj/project.pbxproj +++ b/Evergreen.xcodeproj/project.pbxproj @@ -8,6 +8,14 @@ /* Begin PBXBuildFile section */ 8403E75B201C4A79007F7246 /* FeedListKeyboardDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8403E75A201C4A79007F7246 /* FeedListKeyboardDelegate.swift */; }; + 840D617F2029031C009BC708 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840D617E2029031C009BC708 /* AppDelegate.swift */; }; + 840D61812029031C009BC708 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840D61802029031C009BC708 /* MasterViewController.swift */; }; + 840D61832029031C009BC708 /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840D61822029031C009BC708 /* DetailViewController.swift */; }; + 840D61862029031C009BC708 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 840D61842029031C009BC708 /* Main.storyboard */; }; + 840D61882029031D009BC708 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 840D61872029031D009BC708 /* Assets.xcassets */; }; + 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 */; }; 841ABA4E20145E7300980E11 /* NothingInspectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841ABA4D20145E7300980E11 /* NothingInspectorViewController.swift */; }; 841ABA5E20145E9200980E11 /* FolderInspectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841ABA5D20145E9200980E11 /* FolderInspectorViewController.swift */; }; @@ -108,7 +116,7 @@ 84B06FFE1ED3818D00F0B54B /* RSTree.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84B06FFA1ED3818000F0B54B /* RSTree.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 84B0700A1ED3822600F0B54B /* RSTextDrawing.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84B070071ED3821900F0B54B /* RSTextDrawing.framework */; }; 84B0700B1ED3822600F0B54B /* RSTextDrawing.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84B070071ED3821900F0B54B /* RSTextDrawing.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 84B7178C201E66580091657D /* MainWindowController+ContextualMenus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B7178B201E66580091657D /* MainWindowController+ContextualMenus.swift */; }; + 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 */; }; @@ -167,19 +175,19 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 84659B8920259341008DB8F8 /* PBXContainerItemProxy */ = { + 840D61922029031D009BC708 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 84659B8020259341008DB8F8 /* Evergreen-iOS.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 84E3B15E2025877000E03C2F; + containerPortal = 849C64581ED37A5D003D8FC0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 840D617B2029031C009BC708; remoteInfo = "Evergreen-iOS"; }; - 84659B8B20259341008DB8F8 /* PBXContainerItemProxy */ = { + 840D619D2029031E009BC708 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 84659B8020259341008DB8F8 /* Evergreen-iOS.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 84E3B1742025877000E03C2F; - remoteInfo = "Evergreen-iOSTests"; + containerPortal = 849C64581ED37A5D003D8FC0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 840D617B2029031C009BC708; + remoteInfo = "Evergreen-iOS"; }; 846E77201F6EF5D100A165E2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; @@ -485,6 +493,20 @@ /* Begin PBXFileReference section */ 8403E75A201C4A79007F7246 /* FeedListKeyboardDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListKeyboardDelegate.swift; sourceTree = ""; }; + 840D617C2029031C009BC708 /* Evergreen.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Evergreen.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 840D617E2029031C009BC708 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 840D61802029031C009BC708 /* MasterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MasterViewController.swift; sourceTree = ""; }; + 840D61822029031C009BC708 /* DetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; + 840D61852029031C009BC708 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 840D61872029031D009BC708 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 840D618A2029031D009BC708 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 840D618C2029031D009BC708 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 840D61912029031D009BC708 /* Evergreen-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Evergreen-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 840D61952029031D009BC708 /* Evergreen_iOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Evergreen_iOSTests.swift; sourceTree = ""; }; + 840D61972029031D009BC708 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 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 = ""; }; + 840D61A22029031E009BC708 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8414AD241FCF5A1E00955102 /* TimelineHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineHeaderView.swift; sourceTree = ""; }; 841ABA4D20145E7300980E11 /* NothingInspectorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NothingInspectorViewController.swift; sourceTree = ""; }; 841ABA5D20145E9200980E11 /* FolderInspectorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FolderInspectorViewController.swift; sourceTree = ""; }; @@ -515,7 +537,6 @@ 845EE7B01FC2366500854A1F /* StarredFeedDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarredFeedDelegate.swift; sourceTree = ""; }; 845EE7C01FC2488C00854A1F /* SmartFeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartFeed.swift; sourceTree = ""; }; 845F52EC1FB2B9FC00C10BF0 /* FeedPasteboardWriter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedPasteboardWriter.swift; sourceTree = ""; }; - 84659B8020259341008DB8F8 /* Evergreen-iOS.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "Evergreen-iOS.xcodeproj"; path = "Evergreen-iOS/Evergreen-iOS.xcodeproj"; sourceTree = ""; }; 846E77161F6EF5D000A165E2 /* Database.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Database.xcodeproj; path = Frameworks/Database/Database.xcodeproj; sourceTree = ""; }; 846E77301F6EF5D600A165E2 /* Account.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Account.xcodeproj; path = Frameworks/Account/Account.xcodeproj; sourceTree = ""; }; 84702AA31FA27AC0006B8943 /* MarkReadOrUnreadCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkReadOrUnreadCommand.swift; sourceTree = ""; }; @@ -584,7 +605,7 @@ 84B06FE01ED3803200F0B54B /* RSFeedFinder.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSFeedFinder.xcodeproj; path = Frameworks/RSFeedFinder/RSFeedFinder.xcodeproj; sourceTree = ""; }; 84B06FF41ED3818000F0B54B /* RSTree.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSTree.xcodeproj; path = Frameworks/RSTree/RSTree.xcodeproj; sourceTree = ""; }; 84B070011ED3821800F0B54B /* RSTextDrawing.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSTextDrawing.xcodeproj; path = Frameworks/RSTextDrawing/RSTextDrawing.xcodeproj; sourceTree = ""; }; - 84B7178B201E66580091657D /* MainWindowController+ContextualMenus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "MainWindowController+ContextualMenus.swift"; sourceTree = ""; }; + 84B7178B201E66580091657D /* SidebarViewController+ContextualMenus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SidebarViewController+ContextualMenus.swift"; sourceTree = ""; }; 84B99C661FAE35E600ECDEDB /* FeedListTreeControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListTreeControllerDelegate.swift; sourceTree = ""; }; 84B99C681FAE36B800ECDEDB /* FeedListFolder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListFolder.swift; sourceTree = ""; }; 84B99C6A1FAE370B00ECDEDB /* FeedListFeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListFeed.swift; sourceTree = ""; }; @@ -639,6 +660,27 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 840D61792029031C009BC708 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 840D618E2029031D009BC708 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 840D61992029031D009BC708 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 849C645D1ED37A5D003D8FC0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -668,6 +710,38 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 840D617D2029031C009BC708 /* Evergreen-iOS */ = { + isa = PBXGroup; + children = ( + 840D617E2029031C009BC708 /* AppDelegate.swift */, + 840D61802029031C009BC708 /* MasterViewController.swift */, + 840D61822029031C009BC708 /* DetailViewController.swift */, + 840D61842029031C009BC708 /* Main.storyboard */, + 840D61872029031D009BC708 /* Assets.xcassets */, + 840D61892029031D009BC708 /* LaunchScreen.storyboard */, + 840D618C2029031D009BC708 /* Info.plist */, + ); + path = "Evergreen-iOS"; + sourceTree = ""; + }; + 840D61942029031D009BC708 /* Evergreen-iOSTests */ = { + isa = PBXGroup; + children = ( + 840D61952029031D009BC708 /* Evergreen_iOSTests.swift */, + 840D61972029031D009BC708 /* Info.plist */, + ); + path = "Evergreen-iOSTests"; + sourceTree = ""; + }; + 840D619F2029031E009BC708 /* Evergreen-iOSUITests */ = { + isa = PBXGroup; + children = ( + 840D61A02029031E009BC708 /* Evergreen_iOSUITests.swift */, + 840D61A22029031E009BC708 /* Info.plist */, + ); + path = "Evergreen-iOSUITests"; + sourceTree = ""; + }; 8426119C1FCB6ED40086A189 /* HTMLMetadata */ = { isa = PBXGroup; children = ( @@ -699,7 +773,6 @@ 849A977C1ED9EC42007D329B /* Detail */, 849A97551ED9EAC3007D329B /* Add Feed */, 849A97411ED9EAA9007D329B /* Add Folder */, - 84B7178A201E66580091657D /* ContextualMenus */, ); name = MainWindow; path = Evergreen/MainWindow; @@ -763,15 +836,6 @@ path = Cell; sourceTree = ""; }; - 84659B8120259341008DB8F8 /* Products */ = { - isa = PBXGroup; - children = ( - 84659B8A20259341008DB8F8 /* Evergreen-iOS.app */, - 84659B8C20259341008DB8F8 /* Evergreen-iOSTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; 846E77171F6EF5D000A165E2 /* Products */ = { isa = PBXGroup; children = ( @@ -849,6 +913,7 @@ isa = PBXGroup; children = ( 849A97621ED9EB96007D329B /* SidebarViewController.swift */, + 84B7178B201E66580091657D /* SidebarViewController+ContextualMenus.swift */, 849A97601ED9EB96007D329B /* SidebarOutlineView.swift */, 849A97611ED9EB96007D329B /* SidebarTreeControllerDelegate.swift */, 849A97631ED9EB96007D329B /* UnreadCountView.swift */, @@ -1001,11 +1066,13 @@ D5907D6F2004AB67005947E5 /* Scriptability */, D5558FD6200227E60066386B /* AppleEvents */, 849A97991ED9EFB6007D329B /* Resources */, + 840D617D2029031C009BC708 /* Evergreen-iOS */, + 840D61942029031D009BC708 /* Evergreen-iOSTests */, + 840D619F2029031E009BC708 /* Evergreen-iOSUITests */, 84FB9A2C1EDCD6A4003D53B9 /* Frameworks */, 849C64741ED37A5D003D8FC0 /* EvergreenTests */, D5907CDA2002F084005947E5 /* xcconfig */, 849C64611ED37A5D003D8FC0 /* Products */, - 84659B8020259341008DB8F8 /* Evergreen-iOS.xcodeproj */, 846E77301F6EF5D600A165E2 /* Account.xcodeproj */, 846E77161F6EF5D000A165E2 /* Database.xcodeproj */, 84BB4B611F1174D400858766 /* Data.xcodeproj */, @@ -1025,6 +1092,9 @@ children = ( 849C64601ED37A5D003D8FC0 /* Evergreen.app */, 849C64711ED37A5D003D8FC0 /* EvergreenTests.xctest */, + 840D617C2029031C009BC708 /* Evergreen.app */, + 840D61912029031D009BC708 /* Evergreen-iOSTests.xctest */, + 840D619C2029031D009BC708 /* Evergreen-iOSUITests.xctest */, ); name = Products; sourceTree = ""; @@ -1124,14 +1194,6 @@ name = Products; sourceTree = ""; }; - 84B7178A201E66580091657D /* ContextualMenus */ = { - isa = PBXGroup; - children = ( - 84B7178B201E66580091657D /* MainWindowController+ContextualMenus.swift */, - ); - path = ContextualMenus; - sourceTree = ""; - }; 84BB4B621F1174D400858766 /* Products */ = { isa = PBXGroup; children = ( @@ -1261,6 +1323,59 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 840D617B2029031C009BC708 /* Evergreen-iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 840D61A32029031E009BC708 /* Build configuration list for PBXNativeTarget "Evergreen-iOS" */; + buildPhases = ( + 840D61782029031C009BC708 /* Sources */, + 840D61792029031C009BC708 /* Frameworks */, + 840D617A2029031C009BC708 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Evergreen-iOS"; + productName = "Evergreen-iOS"; + productReference = 840D617C2029031C009BC708 /* Evergreen.app */; + productType = "com.apple.product-type.application"; + }; + 840D61902029031D009BC708 /* Evergreen-iOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 840D61A62029031E009BC708 /* Build configuration list for PBXNativeTarget "Evergreen-iOSTests" */; + buildPhases = ( + 840D618D2029031D009BC708 /* Sources */, + 840D618E2029031D009BC708 /* Frameworks */, + 840D618F2029031D009BC708 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 840D61932029031D009BC708 /* PBXTargetDependency */, + ); + name = "Evergreen-iOSTests"; + productName = "Evergreen-iOSTests"; + productReference = 840D61912029031D009BC708 /* Evergreen-iOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 840D619B2029031D009BC708 /* Evergreen-iOSUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 840D61A92029031E009BC708 /* Build configuration list for PBXNativeTarget "Evergreen-iOSUITests" */; + buildPhases = ( + 840D61982029031D009BC708 /* Sources */, + 840D61992029031D009BC708 /* Frameworks */, + 840D619A2029031D009BC708 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 840D619E2029031E009BC708 /* PBXTargetDependency */, + ); + name = "Evergreen-iOSUITests"; + productName = "Evergreen-iOSUITests"; + productReference = 840D619C2029031D009BC708 /* Evergreen-iOSUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; 849C645F1ED37A5D003D8FC0 /* Evergreen */ = { isa = PBXNativeTarget; buildConfigurationList = 849C647A1ED37A5D003D8FC0 /* Build configuration list for PBXNativeTarget "Evergreen" */; @@ -1316,10 +1431,27 @@ 849C64581ED37A5D003D8FC0 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0820; + LastSwiftUpdateCheck = 0930; LastUpgradeCheck = 0930; ORGANIZATIONNAME = "Ranchero Software"; TargetAttributes = { + 840D617B2029031C009BC708 = { + CreatedOnToolsVersion = 9.3; + DevelopmentTeam = 9C84TZ7Q6Z; + ProvisioningStyle = Automatic; + }; + 840D61902029031D009BC708 = { + CreatedOnToolsVersion = 9.3; + DevelopmentTeam = 9C84TZ7Q6Z; + ProvisioningStyle = Automatic; + TestTargetID = 840D617B2029031C009BC708; + }; + 840D619B2029031D009BC708 = { + CreatedOnToolsVersion = 9.3; + DevelopmentTeam = 9C84TZ7Q6Z; + ProvisioningStyle = Automatic; + TestTargetID = 840D617B2029031C009BC708; + }; 849C645F1ED37A5D003D8FC0 = { CreatedOnToolsVersion = 8.2.1; DevelopmentTeam = M8L2WTLA8W; @@ -1361,10 +1493,6 @@ ProductGroup = 84B06FC71ED37F7200F0B54B /* Products */; ProjectRef = 84B06FC61ED37F7200F0B54B /* DB5.xcodeproj */; }, - { - ProductGroup = 84659B8120259341008DB8F8 /* Products */; - ProjectRef = 84659B8020259341008DB8F8 /* Evergreen-iOS.xcodeproj */; - }, { ProductGroup = 84B06FA31ED37DAC00F0B54B /* Products */; ProjectRef = 84B06FA21ED37DAC00F0B54B /* RSCore.xcodeproj */; @@ -1398,25 +1526,14 @@ targets = ( 849C645F1ED37A5D003D8FC0 /* Evergreen */, 849C64701ED37A5D003D8FC0 /* EvergreenTests */, + 840D617B2029031C009BC708 /* Evergreen-iOS */, + 840D61902029031D009BC708 /* Evergreen-iOSTests */, + 840D619B2029031D009BC708 /* Evergreen-iOSUITests */, ); }; /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - 84659B8A20259341008DB8F8 /* Evergreen-iOS.app */ = { - isa = PBXReferenceProxy; - fileType = wrapper.application; - path = "Evergreen-iOS.app"; - remoteRef = 84659B8920259341008DB8F8 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84659B8C20259341008DB8F8 /* Evergreen-iOSTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "Evergreen-iOSTests.xctest"; - remoteRef = 84659B8B20259341008DB8F8 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; 846E77211F6EF5D100A165E2 /* Database.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; @@ -1595,6 +1712,30 @@ /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ + 840D617A2029031C009BC708 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 840D618B2029031D009BC708 /* LaunchScreen.storyboard in Resources */, + 840D61882029031D009BC708 /* Assets.xcassets in Resources */, + 840D61862029031C009BC708 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 840D618F2029031D009BC708 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 840D619A2029031D009BC708 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 849C645E1ED37A5D003D8FC0 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1648,6 +1789,32 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 840D61782029031C009BC708 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 840D61832029031C009BC708 /* DetailViewController.swift in Sources */, + 840D61812029031C009BC708 /* MasterViewController.swift in Sources */, + 840D617F2029031C009BC708 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 840D618D2029031D009BC708 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 840D61962029031D009BC708 /* Evergreen_iOSTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 840D61982029031D009BC708 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 840D61A12029031E009BC708 /* Evergreen_iOSUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 849C645C1ED37A5D003D8FC0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1693,7 +1860,7 @@ 84A14FF320048CA70046AD9A /* SendToMicroBlogCommand.swift in Sources */, 849A97891ED9ECEF007D329B /* ArticleStyle.swift in Sources */, 84FF69B11FC3793300DC198E /* FaviconURLFinder.swift in Sources */, - 84B7178C201E66580091657D /* MainWindowController+ContextualMenus.swift in Sources */, + 84B7178C201E66580091657D /* SidebarViewController+ContextualMenus.swift in Sources */, 842611A21FCB769D0086A189 /* RSHTMLMetadata+Extension.swift in Sources */, 84A1500520048DDF0046AD9A /* SendToMarsEditCommand.swift in Sources */, D5907DB22004BB37005947E5 /* ScriptingObjectContainer.swift in Sources */, @@ -1771,6 +1938,16 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 840D61932029031D009BC708 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 840D617B2029031C009BC708 /* Evergreen-iOS */; + targetProxy = 840D61922029031D009BC708 /* PBXContainerItemProxy */; + }; + 840D619E2029031E009BC708 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 840D617B2029031C009BC708 /* Evergreen-iOS */; + targetProxy = 840D619D2029031E009BC708 /* PBXContainerItemProxy */; + }; 846E77401F6EF67A00A165E2 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Account; @@ -1834,6 +2011,22 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + 840D61842029031C009BC708 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 840D61852029031C009BC708 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 840D61892029031D009BC708 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 840D618A2029031D009BC708 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; 849A97931ED9EF7A007D329B /* IndeterminateProgressWindow.xib */ = { isa = PBXVariantGroup; children = ( @@ -1894,6 +2087,405 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 840D61A42029031E009BC708 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 9C84TZ7Q6Z; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "Evergreen-iOS/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOS"; + PRODUCT_NAME = Evergreen; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 840D61A52029031E009BC708 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 9C84TZ7Q6Z; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "Evergreen-iOS/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOS"; + PRODUCT_NAME = Evergreen; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 840D61A72029031E009BC708 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 9C84TZ7Q6Z; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "Evergreen-iOSTests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Evergreen-iOS.app/Evergreen-iOS"; + }; + name = Debug; + }; + 840D61A82029031E009BC708 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 9C84TZ7Q6Z; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "Evergreen-iOSTests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Evergreen-iOS.app/Evergreen-iOS"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 840D61AA2029031E009BC708 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 9C84TZ7Q6Z; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "Evergreen-iOSUITests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOSUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "Evergreen-iOS"; + }; + name = Debug; + }; + 840D61AB2029031E009BC708 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 9C84TZ7Q6Z; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "Evergreen-iOSUITests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOSUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "Evergreen-iOS"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; 849C64781ED37A5D003D8FC0 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = D5907CDD2002F0BE005947E5 /* Evergreen_project_debug.xcconfig */; @@ -1941,6 +2533,33 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 840D61A32029031E009BC708 /* Build configuration list for PBXNativeTarget "Evergreen-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 840D61A42029031E009BC708 /* Debug */, + 840D61A52029031E009BC708 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 840D61A62029031E009BC708 /* Build configuration list for PBXNativeTarget "Evergreen-iOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 840D61A72029031E009BC708 /* Debug */, + 840D61A82029031E009BC708 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 840D61A92029031E009BC708 /* Build configuration list for PBXNativeTarget "Evergreen-iOSUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 840D61AA2029031E009BC708 /* Debug */, + 840D61AB2029031E009BC708 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 849C645B1ED37A5D003D8FC0 /* Build configuration list for PBXProject "Evergreen" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Evergreen/AppDelegate.swift b/Evergreen/AppDelegate.swift index 36f04da16..9ac432399 100644 --- a/Evergreen/AppDelegate.swift +++ b/Evergreen/AppDelegate.swift @@ -101,6 +101,12 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations, addFolderWindowController!.runSheetOnWindow(window) } + func showAddFeedSheetOnWindow(_ window: NSWindow, urlString: String?, name: String?) { + + addFeedController = AddFeedController(hostWindow: window) + addFeedController?.showAddFeedSheet(urlString, name) + } + // MARK: - NSApplicationDelegate func applicationDidFinishLaunching(_ note: Notification) { @@ -249,15 +255,20 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations, func validateUserInterfaceItem(_ item: NSValidatedUserInterfaceItem) -> Bool { + let isDisplayingSheet = mainWindowController?.isDisplayingSheet ?? false + if item.action == #selector(refreshAll(_:)) { return !AccountManager.shared.refreshInProgress } if item.action == #selector(addAppNews(_:)) { - return !AccountManager.shared.anyAccountHasFeedWithURL(appNewsURLString) + return !isDisplayingSheet && !AccountManager.shared.anyAccountHasFeedWithURL(appNewsURLString) } if item.action == #selector(sortByNewestArticleOnTop(_:)) || item.action == #selector(sortByOldestArticleOnTop(_:)) { return mainWindowController?.isOpen ?? false } + if item.action == #selector(showAddFeedWindow(_:)) || item.action == #selector(showAddFolderWindow(_:)) { + return !isDisplayingSheet + } return true } @@ -266,9 +277,11 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations, func addFeed(_ urlString: String?, _ name: String? = nil) { createAndShowMainWindow() + if mainWindowController!.isDisplayingSheet { + return + } - addFeedController = AddFeedController(hostWindow: mainWindowController!.window!) - addFeedController?.showAddFeedSheet(urlString, name) + showAddFeedSheetOnWindow(mainWindowController!.window!, urlString: urlString, name: name) } // MARK: - Actions diff --git a/Evergreen/Base.lproj/MainWindow.storyboard b/Evergreen/Base.lproj/MainWindow.storyboard index 49801d380..a2232733d 100644 --- a/Evergreen/Base.lproj/MainWindow.storyboard +++ b/Evergreen/Base.lproj/MainWindow.storyboard @@ -1,7 +1,7 @@ - + - + diff --git a/Evergreen/Base.lproj/RenameSheet.xib b/Evergreen/Base.lproj/RenameSheet.xib index 6722eaaeb..e76af7899 100644 --- a/Evergreen/Base.lproj/RenameSheet.xib +++ b/Evergreen/Base.lproj/RenameSheet.xib @@ -10,11 +10,12 @@ + - + @@ -41,13 +42,22 @@ + + + diff --git a/Evergreen/Info.plist b/Evergreen/Info.plist index 955ced730..7100a1767 100644 --- a/Evergreen/Info.plist +++ b/Evergreen/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0d34 + 1.0d35 CFBundleVersion 522 LSMinimumSystemVersion diff --git a/Evergreen/MainWindow/MainWindowController.swift b/Evergreen/MainWindow/MainWindowController.swift index c31e811d2..3132c8149 100644 --- a/Evergreen/MainWindow/MainWindowController.swift +++ b/Evergreen/MainWindow/MainWindowController.swift @@ -18,6 +18,13 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { return isWindowLoaded && window!.isVisible } + var isDisplayingSheet: Bool { + if let _ = window?.attachedSheet { + return true + } + return false + } + // MARK: NSWindowController private let windowAutosaveName = NSWindow.FrameAutosaveName(rawValue: kWindowFrameKey) @@ -168,7 +175,12 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { appDelegate.showAddFolderSheetOnWindow(window!) } - + + @IBAction func showAddFeedWindow(_ sender: Any) { + + appDelegate.showAddFeedSheetOnWindow(window!, urlString: nil, name: nil) + } + @IBAction func openArticleInBrowser(_ sender: Any?) { if let link = currentLink { diff --git a/Evergreen/MainWindow/Sidebar/FeedPasteboardWriter.swift b/Evergreen/MainWindow/Sidebar/FeedPasteboardWriter.swift index bfeba3f1f..6554d0281 100644 --- a/Evergreen/MainWindow/Sidebar/FeedPasteboardWriter.swift +++ b/Evergreen/MainWindow/Sidebar/FeedPasteboardWriter.swift @@ -26,7 +26,7 @@ import Data func writableTypes(for pasteboard: NSPasteboard) -> [NSPasteboard.PasteboardType] { - return [.string, .URL, FeedPasteboardWriter.feedUTIType, FeedPasteboardWriter.feedUTIInternalType] + return [FeedPasteboardWriter.feedUTIType, .URL, .string, FeedPasteboardWriter.feedUTIInternalType] } func pasteboardPropertyList(forType type: NSPasteboard.PasteboardType) -> Any? { diff --git a/Evergreen/MainWindow/Sidebar/Renaming/RenameWindowController.swift b/Evergreen/MainWindow/Sidebar/Renaming/RenameWindowController.swift index 12bc8fd1f..c88dca2c5 100644 --- a/Evergreen/MainWindow/Sidebar/Renaming/RenameWindowController.swift +++ b/Evergreen/MainWindow/Sidebar/Renaming/RenameWindowController.swift @@ -8,17 +8,71 @@ import AppKit +protocol RenameWindowControllerDelegate { + + func renameWindowController(_ windowController: RenameWindowController, didRenameObject: Any, withNewName: String) +} + final class RenameWindowController: NSWindowController { @IBOutlet var renamePrompt: NSTextField! @IBOutlet var newTitleTextField: NSTextField! @IBOutlet var renameButton: NSButton! - private var originalTitle: String! + private var originalTitle: String? + private var representedObject: Any? + private var delegate: RenameWindowControllerDelegate? - public convenience init(originalTitle: String) { + convenience init(originalTitle: String, representedObject: Any, delegate: RenameWindowControllerDelegate) { self.init(windowNibName: NSNib.Name(rawValue: "RenameSheet")) self.originalTitle = originalTitle + self.representedObject = representedObject + self.delegate = delegate + } + + override func windowDidLoad() { + + newTitleTextField.stringValue = originalTitle! + + let prompt = NSLocalizedString("Rename %@ to:", comment: "Rename sheet") + let localizedPrompt = NSString.localizedStringWithFormat(prompt as NSString, originalTitle!) + renamePrompt.stringValue = localizedPrompt as String + + updateUI() + } + + // MARK: Actions + + @IBAction func cancel(_ sender: AnyObject) { + + window?.sheetParent?.endSheet(window!, returnCode: .cancel) + } + + @IBAction func rename(_ sender: AnyObject) { + + guard let representedObject = representedObject else { + return + } + delegate?.renameWindowController(self, didRenameObject: representedObject, withNewName: newTitleTextField.stringValue) + window?.sheetParent?.endSheet(window!, returnCode: .OK) + } + +} + +extension RenameWindowController: NSTextFieldDelegate { + + override func controlTextDidChange(_ obj: Notification) { + + updateUI() + } +} + +private extension RenameWindowController { + + func updateUI() { + + let newTitle = newTitleTextField.stringValue + renameButton.isEnabled = !newTitle.isEmpty && newTitle != originalTitle } } diff --git a/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift b/Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift similarity index 65% rename from Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift rename to Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift index 58729d69e..70e79fac6 100644 --- a/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift +++ b/Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift @@ -1,5 +1,5 @@ // -// MainWindowController+ContextualMenus.swift +// SidebarViewController+ContextualMenus.swift // Evergreen // // Created by Brent Simmons on 1/28/18. @@ -11,12 +11,12 @@ import Data import Account import RSCore -extension MainWindowController { +extension SidebarViewController { func menu(for objects: [Any]?) -> NSMenu? { guard let objects = objects, objects.count > 0 else { - return nil + return menuForNoSelection() } if objects.count == 1 { @@ -35,7 +35,7 @@ extension MainWindowController { // MARK: Contextual Menu Actions -extension MainWindowController { +extension SidebarViewController { @objc func openHomePageFromContextualMenu(_ sender: Any?) { @@ -55,6 +55,19 @@ extension MainWindowController { @objc func markObjectsReadFromContextualMenu(_ sender: Any?) { + guard let menuItem = sender as? NSMenuItem, let objects = menuItem.representedObject as? [Any] else { + return + } + + let articles = unreadArticles(for: objects) + if articles.isEmpty { + return + } + + guard let undoManager = undoManager, let markReadCommand = MarkReadOrUnreadCommand(initialArticles: Array(articles), markingRead: true, undoManager: undoManager) else { + return + } + runCommand(markReadCommand) } @objc func deleteFromContextualMenu(_ sender: Any?) { @@ -63,12 +76,44 @@ extension MainWindowController { @objc func renameFromContextualMenu(_ sender: Any?) { + guard let window = view.window, let menuItem = sender as? NSMenuItem, let object = menuItem.representedObject as? DisplayNameProvider, object is Feed || object is Folder else { + return + } + + renameWindowController = RenameWindowController(originalTitle: object.nameForDisplay, representedObject: object, delegate: self) + guard let renameSheet = renameWindowController?.window else { + return + } + window.beginSheet(renameSheet) + } +} + +extension SidebarViewController: RenameWindowControllerDelegate { + + func renameWindowController(_ windowController: RenameWindowController, didRenameObject object: Any, withNewName name: String) { + + if let feed = object as? Feed { + feed.editedName = name + } + else if let folder = object as? Folder { + folder.name = name + } } } // MARK: Build Contextual Menus -private extension MainWindowController { +private extension SidebarViewController { + + func menuForNoSelection() -> NSMenu { + + let menu = NSMenu(title: "") + + menu.addItem(withTitle: NSLocalizedString("New Feed", comment: "Command"), action: #selector(MainWindowController.showAddFeedWindow(_:)), keyEquivalent: "") + menu.addItem(withTitle: NSLocalizedString("New Folder", comment: "Command"), action: #selector(MainWindowController.showAddFolderWindow(_:)), keyEquivalent: "") + + return menu + } func menuForFeed(_ feed: Feed) -> NSMenu? { @@ -95,7 +140,7 @@ private extension MainWindowController { menu.addItem(NSMenuItem.separator()) menu.addItem(renameMenuItem(feed)) - menu.addItem(deleteMenuItem([feed])) +// menu.addItem(deleteMenuItem([feed])) return menu } @@ -110,7 +155,7 @@ private extension MainWindowController { } menu.addItem(renameMenuItem(folder)) - menu.addItem(deleteMenuItem([folder])) +// menu.addItem(deleteMenuItem([folder])) return menu.numberOfItems > 0 ? menu : nil } @@ -125,10 +170,10 @@ private extension MainWindowController { if anyObjectInArrayHasNonZeroUnreadCount(objects) { menu.addItem(markAllReadMenuItem(objects)) - menu.addItem(NSMenuItem.separator()) +// menu.addItem(NSMenuItem.separator()) } - menu.addItem(deleteMenuItem(objects)) +// menu.addItem(deleteMenuItem(objects)) return menu.numberOfItems > 0 ? menu : nil } @@ -182,5 +227,16 @@ private extension MainWindowController { item.target = self return item } + + func unreadArticles(for objects: [Any]) -> Set
{ + + var articles = Set
() + for object in objects { + if let articleFetcher = object as? ArticleFetcher { + articles.formUnion(articleFetcher.fetchUnreadArticles()) + } + } + return articles + } } diff --git a/Evergreen/MainWindow/Sidebar/SidebarViewController.swift b/Evergreen/MainWindow/Sidebar/SidebarViewController.swift index 58721cefa..788051ae5 100644 --- a/Evergreen/MainWindow/Sidebar/SidebarViewController.swift +++ b/Evergreen/MainWindow/Sidebar/SidebarViewController.swift @@ -25,6 +25,8 @@ import RSCore private var animatingChanges = false private var sidebarCellAppearance: SidebarCellAppearance! + var renameWindowController: RenameWindowController? + var selectedObjects: [AnyObject] { return selectedNodes.representedObjects() } @@ -195,10 +197,7 @@ import RSCore func contextualMenuForSelectedObjects() -> NSMenu? { - guard let mainWindowController = view.window?.windowController as? MainWindowController else { - return nil - } - return mainWindowController.menu(for: selectedObjects) + return menu(for: selectedObjects) } // MARK: NSOutlineViewDelegate diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 4f723d5aa..b547ef459 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -333,7 +333,14 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, validateUnreadCount(feed, articles) return articles } - + + public func fetchUnreadArticles(for feed: Feed) -> Set
{ + + let articles = database.fetchUnreadArticles(for: Set([feed])) + validateUnreadCount(feed, articles) + return articles + } + public func fetchArticles(folder: Folder) -> Set
{ let feeds = folder.flattenedFeeds() diff --git a/Frameworks/Account/Account.xcodeproj/project.pbxproj b/Frameworks/Account/Account.xcodeproj/project.pbxproj index c4934b57f..41d7dbda3 100644 --- a/Frameworks/Account/Account.xcodeproj/project.pbxproj +++ b/Frameworks/Account/Account.xcodeproj/project.pbxproj @@ -28,6 +28,7 @@ 84C3654A1F899F3B001EC85C /* CombinedRefreshProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C365491F899F3B001EC85C /* CombinedRefreshProgress.swift */; }; 84C8B3F41F89DE430053CCA6 /* DataExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C8B3F31F89DE430053CCA6 /* DataExtensions.swift */; }; 84CAD7161FDF2E22000F0755 /* FeedbinArticle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CAD7151FDF2E22000F0755 /* FeedbinArticle.swift */; }; + 84F73CF1202788D90000BCEF /* ArticleFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F73CF0202788D80000BCEF /* ArticleFetcher.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -128,6 +129,7 @@ 84C365491F899F3B001EC85C /* CombinedRefreshProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CombinedRefreshProgress.swift; sourceTree = ""; }; 84C8B3F31F89DE430053CCA6 /* DataExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataExtensions.swift; sourceTree = ""; }; 84CAD7151FDF2E22000F0755 /* FeedbinArticle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinArticle.swift; sourceTree = ""; }; + 84F73CF0202788D80000BCEF /* ArticleFetcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleFetcher.swift; sourceTree = ""; }; D511EEB5202422BB00712EC3 /* Account_project_debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Account_project_debug.xcconfig; sourceTree = ""; }; D511EEB6202422BB00712EC3 /* Account_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Account_target.xcconfig; sourceTree = ""; }; D511EEB7202422BB00712EC3 /* Account_project_release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Account_project_release.xcconfig; sourceTree = ""; }; @@ -237,6 +239,7 @@ 84B99C9E1FAE8D3200ECDEDB /* ContainerPath.swift */, 84C365491F899F3B001EC85C /* CombinedRefreshProgress.swift */, 84C8B3F31F89DE430053CCA6 /* DataExtensions.swift */, + 84F73CF0202788D80000BCEF /* ArticleFetcher.swift */, 8419740D1F6DD25F006346C4 /* Container.swift */, 8419742B1F6DDE84006346C4 /* LocalAccount */, 84245C7D1FDDD2580074AFBB /* Feedbin */, @@ -476,6 +479,7 @@ 84C3654A1F899F3B001EC85C /* CombinedRefreshProgress.swift in Sources */, 8469F81C1F6DD15E0084783E /* Account.swift in Sources */, 846E77451F6EF9B900A165E2 /* Container.swift in Sources */, + 84F73CF1202788D90000BCEF /* ArticleFetcher.swift in Sources */, 84245C7F1FDDD2580074AFBB /* FeedbinAccountDelegate.swift in Sources */, 841974251F6DDCE4006346C4 /* AccountDelegate.swift in Sources */, 846E77541F6F00E300A165E2 /* AccountManager.swift in Sources */, diff --git a/Frameworks/Account/ArticleFetcher.swift b/Frameworks/Account/ArticleFetcher.swift new file mode 100644 index 000000000..0b8188b03 --- /dev/null +++ b/Frameworks/Account/ArticleFetcher.swift @@ -0,0 +1,55 @@ +// +// ArticleFetcher.swift +// Account +// +// Created by Brent Simmons on 2/4/18. +// Copyright © 2018 Ranchero Software, LLC. All rights reserved. +// + +import Foundation +import Data + +public protocol ArticleFetcher { + + func fetchArticles() -> Set
+ func fetchUnreadArticles() -> Set
+} + +extension Feed: ArticleFetcher { + + public func fetchArticles() -> Set
{ + + guard let account = account else { + assertionFailure("Expected feed.account, but got nil.") + return Set
() + } + return account.fetchArticles(for: self) + } + + public func fetchUnreadArticles() -> Set
{ + + guard let account = account else { + assertionFailure("Expected feed.account, but got nil.") + return Set
() + } + return account.fetchUnreadArticles(for: self) + } +} + +extension Folder: ArticleFetcher { + + public func fetchArticles() -> Set
{ + + return fetchUnreadArticles() + } + + public func fetchUnreadArticles() -> Set
{ + + guard let account = account else { + assertionFailure("Expected folder.account, but got nil.") + return Set
() + } + + return account.fetchArticles(folder: self) + } +} diff --git a/Frameworks/Account/DataExtensions.swift b/Frameworks/Account/DataExtensions.swift index 9e565a73a..7f813cba7 100644 --- a/Frameworks/Account/DataExtensions.swift +++ b/Frameworks/Account/DataExtensions.swift @@ -23,15 +23,6 @@ public extension Feed { } } - public func fetchArticles() -> Set
{ - - guard let account = account else { - assertionFailure("Expected feed.account.") - return Set
() - } - return account.fetchArticles(for: self) - } - public func takeSettings(from parsedFeed: ParsedFeed) { var didChangeAtLeastOneSetting = false diff --git a/Frameworks/Account/Folder.swift b/Frameworks/Account/Folder.swift index 442ada83f..85d411b06 100644 --- a/Frameworks/Account/Folder.swift +++ b/Frameworks/Account/Folder.swift @@ -26,16 +26,6 @@ public final class Folder: DisplayNameProvider, Container, UnreadCountProvider, static var incrementingID = 0 public let hashValue: Int - // MARK: - Fetching Articles - - public func fetchArticles() -> Set
{ - - guard let account = account else { - return Set
() - } - return account.fetchArticles(folder: self) - } - // MARK: - DisplayNameProvider public var nameForDisplay: String {