diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents b/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents index 709f6c327c62..6ea7eebd0f7e 100644 --- a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents +++ b/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents @@ -55,7 +55,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -217,7 +217,7 @@ - + @@ -228,7 +228,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -246,7 +246,7 @@ - + @@ -347,19 +347,19 @@ - + - + - + - + @@ -508,7 +508,7 @@ - + @@ -522,7 +522,7 @@ - + @@ -536,12 +536,12 @@ - + - + @@ -579,7 +579,7 @@ - + @@ -607,7 +607,7 @@ - + @@ -644,7 +644,7 @@ - + @@ -790,7 +790,7 @@ - + @@ -802,7 +802,7 @@ - + @@ -811,7 +811,7 @@ - + diff --git a/WordPress/Classes/Utility/Environment/AppEnvironment.swift b/Sources/WordPressData/Swift/AppEnvironment.swift similarity index 80% rename from WordPress/Classes/Utility/Environment/AppEnvironment.swift rename to Sources/WordPressData/Swift/AppEnvironment.swift index 7acaab7c1aa7..29109fbf06db 100644 --- a/WordPress/Classes/Utility/Environment/AppEnvironment.swift +++ b/Sources/WordPressData/Swift/AppEnvironment.swift @@ -1,21 +1,20 @@ import Foundation import WordPressKit -/// A collection of global variables and singletons that the app wants access to. -/// -struct AppEnvironment { +/// - warning: Soft-deprecated. +public struct AppEnvironment { // MARK: - Globals /// A type to create derived context, save context, etc... - let contextManager: CoreDataStackSwift + public let contextManager: CoreDataStackSwift /// The base url to use for WP.com api requests - let wordPressComApiBase: URL + public let wordPressComApiBase: URL /// The mainContext that has concurrency type NSMainQueueConcurrencyType and should be used /// for UI elements and fetched results controllers. - var mainContext: NSManagedObjectContext { + public var mainContext: NSManagedObjectContext { return contextManager.mainContext } @@ -23,7 +22,7 @@ struct AppEnvironment { /// The current environment. Use this to access the app globals. /// - static private(set) var current = AppEnvironment() + public static private(set) var current = AppEnvironment() // MARK: - Initialization @@ -40,7 +39,7 @@ extension AppEnvironment { /// Creates a new Environment, changing just a subset of the current global dependencies. /// @discardableResult - static func replaceEnvironment( + public static func replaceEnvironment( contextManager: CoreDataStackSwift = AppEnvironment.current.contextManager, wordPressComApiBase: URL = AppEnvironment.current.wordPressComApiBase) -> AppEnvironment { diff --git a/Sources/WordPressData/Swift/Bundle+WordPressData.swift b/Sources/WordPressData/Swift/Bundle+WordPressData.swift new file mode 100644 index 000000000000..c0824c128d2a --- /dev/null +++ b/Sources/WordPressData/Swift/Bundle+WordPressData.swift @@ -0,0 +1,9 @@ +import Foundation + +extension Bundle { + @objc public class var wordPressData: Bundle { + Bundle(for: BundleToken.self) + } +} + +private final class BundleToken {} diff --git a/Sources/WordPressData/Swift/ContextManager.swift b/Sources/WordPressData/Swift/ContextManager.swift index a05647081f5c..a4c1c234a950 100644 --- a/Sources/WordPressData/Swift/ContextManager.swift +++ b/Sources/WordPressData/Swift/ContextManager.swift @@ -155,7 +155,7 @@ public class ContextManager: NSObject, CoreDataStack, CoreDataStackSwift { DDLogWarn("Migration required for persistent store.") - guard let modelFileURL = Bundle(for: ContextManager.self).url(forResource: "WordPress", withExtension: "momd") else { + guard let modelFileURL = Bundle.wordPressData.url(forResource: "WordPress", withExtension: "momd") else { fatalError("Can't find WordPress.momd") } @@ -222,7 +222,7 @@ private extension ContextManager { private extension ContextManager { static func createPersistentContainer(storeURL: URL, modelName: String) -> NSPersistentContainer { - guard var modelFileURL = Bundle(for: ContextManager.self).url(forResource: "WordPress", withExtension: "momd") else { + guard var modelFileURL = Bundle.wordPressData.url(forResource: "WordPress", withExtension: "momd") else { fatalError("Can't find WordPress.momd") } diff --git a/Sources/WordPressData/Swift/CoreDataHelper.swift b/Sources/WordPressData/Swift/CoreDataHelper.swift index e518073e98f6..4d46c8760e3a 100644 --- a/Sources/WordPressData/Swift/CoreDataHelper.swift +++ b/Sources/WordPressData/Swift/CoreDataHelper.swift @@ -358,7 +358,7 @@ public extension CoreDataStack { } private func migrateDatabaseIfNecessary(at databaseLocation: URL) throws { - guard let modelFileURL = Bundle(for: ContextManager.self).url(forResource: "WordPress", withExtension: "momd"), + guard let modelFileURL = Bundle.wordPressData.url(forResource: "WordPress", withExtension: "momd"), let objectModel = NSManagedObjectModel(contentsOf: modelFileURL) else { return } diff --git a/Sources/WordPressData/Swift/CoreDataIterativeMigrator.swift b/Sources/WordPressData/Swift/CoreDataIterativeMigrator.swift index e92a0cb6caf7..bdfeb2304761 100644 --- a/Sources/WordPressData/Swift/CoreDataIterativeMigrator.swift +++ b/Sources/WordPressData/Swift/CoreDataIterativeMigrator.swift @@ -263,7 +263,7 @@ private extension CoreDataIterativeMigrator { } static func model(for metadata: [String: Any]) throws -> NSManagedObjectModel? { - let bundle = Bundle(for: ContextManager.self) + let bundle = Bundle.wordPressData guard let sourceModel = NSManagedObjectModel.mergedModel(from: [bundle], forStoreMetadata: metadata) else { let description = "Failed to find source model for metadata: \(metadata)" throw error(with: .noSourceModelForMetadata, description: description) @@ -287,7 +287,7 @@ private extension CoreDataIterativeMigrator { } static func urlForModel(name: String, in directory: String?) -> URL? { - let bundle = Bundle(for: ContextManager.self) + let bundle = Bundle.wordPressData var url = bundle.url(forResource: name, withExtension: "mom", subdirectory: directory) if url != nil { diff --git a/Sources/WordPressData/Swift/PublicizeInfo+CoreDataClass.swift b/Sources/WordPressData/Swift/PublicizeInfo+CoreDataClass.swift index 31aa7753ba46..5162f92756f9 100644 --- a/Sources/WordPressData/Swift/PublicizeInfo+CoreDataClass.swift +++ b/Sources/WordPressData/Swift/PublicizeInfo+CoreDataClass.swift @@ -8,7 +8,8 @@ import WordPressKit /// Furthermore, sites eligible for unlimited sharing will still return a `PublicizeInfo` along with its sharing /// limitations, but the numbers should be ignored (at least for now). /// -@objc public class PublicizeInfo: NSManagedObject { +@objc(PublicizeInfo) +public class PublicizeInfo: NSManagedObject { public var sharingLimit: SharingLimit { SharingLimit(remaining: Int(sharesRemaining), limit: Int(shareLimit)) diff --git a/Sources/WordPressData/Swift/ReaderAbstractTopic.swift b/Sources/WordPressData/Swift/ReaderAbstractTopic.swift index 3ef6cace96f9..fbaa469eb09b 100644 --- a/Sources/WordPressData/Swift/ReaderAbstractTopic.swift +++ b/Sources/WordPressData/Swift/ReaderAbstractTopic.swift @@ -1,7 +1,8 @@ import Foundation import CoreData -@objc open class ReaderAbstractTopic: NSManagedObject { +@objc(ReaderAbstractTopic) +open class ReaderAbstractTopic: NSManagedObject { // Relations @NSManaged open var posts: [ReaderPost] diff --git a/Sources/WordPressData/Swift/ReaderCrossPostMeta.swift b/Sources/WordPressData/Swift/ReaderCrossPostMeta.swift index b69bf4737b20..bcbee4007e67 100644 --- a/Sources/WordPressData/Swift/ReaderCrossPostMeta.swift +++ b/Sources/WordPressData/Swift/ReaderCrossPostMeta.swift @@ -1,7 +1,8 @@ import Foundation import CoreData -@objc open class ReaderCrossPostMeta: NSManagedObject { +@objc(ReaderCrossPostMeta) +open class ReaderCrossPostMeta: NSManagedObject { // Relations @NSManaged open var post: ReaderPost diff --git a/WordPress/Classes/Models/ReaderDefaultTopic.swift b/Sources/WordPressData/Swift/ReaderDefaultTopic.swift similarity index 55% rename from WordPress/Classes/Models/ReaderDefaultTopic.swift rename to Sources/WordPressData/Swift/ReaderDefaultTopic.swift index c93a49944081..d9553319447e 100644 --- a/WordPress/Classes/Models/ReaderDefaultTopic.swift +++ b/Sources/WordPressData/Swift/ReaderDefaultTopic.swift @@ -1,6 +1,7 @@ import Foundation -@objc open class ReaderDefaultTopic: ReaderAbstractTopic { +@objc(ReaderDefaultTopic) +open class ReaderDefaultTopic: ReaderAbstractTopic { override open class var TopicType: String { return "default" } diff --git a/WordPress/Classes/Models/ReaderListTopic.swift b/Sources/WordPressData/Swift/ReaderListTopic.swift similarity index 82% rename from WordPress/Classes/Models/ReaderListTopic.swift rename to Sources/WordPressData/Swift/ReaderListTopic.swift index 485393a20965..9b61d705b629 100644 --- a/WordPress/Classes/Models/ReaderListTopic.swift +++ b/Sources/WordPressData/Swift/ReaderListTopic.swift @@ -1,6 +1,7 @@ import Foundation -@objc open class ReaderListTopic: ReaderAbstractTopic { +@objc(ReaderListTopic) +open class ReaderListTopic: ReaderAbstractTopic { @NSManaged open var isOwner: Bool @NSManaged open var isPublic: Bool @NSManaged open var listDescription: String diff --git a/Sources/WordPressData/Swift/ReaderSearchSuggestion.swift b/Sources/WordPressData/Swift/ReaderSearchSuggestion.swift index 2c315f4b192b..71d33530d78e 100644 --- a/Sources/WordPressData/Swift/ReaderSearchSuggestion.swift +++ b/Sources/WordPressData/Swift/ReaderSearchSuggestion.swift @@ -2,7 +2,8 @@ import Foundation import CoreData @available(*, deprecated, message: "No longer used") -@objc open class ReaderSearchSuggestion: NSManagedObject { +@objc(ReaderSearchSuggestion) +open class ReaderSearchSuggestion: NSManagedObject { @NSManaged open var date: Date? @NSManaged open var searchPhrase: String } diff --git a/Sources/WordPressData/Swift/ReaderSearchTopic.swift b/Sources/WordPressData/Swift/ReaderSearchTopic.swift index 35bf18889aa3..94b50a8cd1dd 100644 --- a/Sources/WordPressData/Swift/ReaderSearchTopic.swift +++ b/Sources/WordPressData/Swift/ReaderSearchTopic.swift @@ -1,6 +1,7 @@ import Foundation -@objc open class ReaderSearchTopic: ReaderAbstractTopic { +@objc(ReaderSearchTopic) +open class ReaderSearchTopic: ReaderAbstractTopic { override open class var TopicType: String { return "search" } diff --git a/Sources/WordPressData/Swift/ReaderSiteInfoSubscriptions.swift b/Sources/WordPressData/Swift/ReaderSiteInfoSubscriptions.swift index d05f12ae2d6b..a363798c7a79 100644 --- a/Sources/WordPressData/Swift/ReaderSiteInfoSubscriptions.swift +++ b/Sources/WordPressData/Swift/ReaderSiteInfoSubscriptions.swift @@ -1,7 +1,8 @@ import Foundation import CoreData -@objc public class ReaderSiteInfoSubscriptionPost: NSManagedObject { +@objc(ReaderSiteInfoSubscriptionPost) +public class ReaderSiteInfoSubscriptionPost: NSManagedObject { @NSManaged open var siteTopic: ReaderSiteTopic @NSManaged open var sendPosts: Bool @@ -22,7 +23,8 @@ import CoreData } } -@objc public class ReaderSiteInfoSubscriptionEmail: NSManagedObject { +@objc(ReaderSiteInfoSubscriptionEmail) +public class ReaderSiteInfoSubscriptionEmail: NSManagedObject { @NSManaged open var siteTopic: ReaderSiteTopic @NSManaged open var sendPosts: Bool @NSManaged open var sendComments: Bool diff --git a/Sources/WordPressData/Swift/ReaderSiteTopic.swift b/Sources/WordPressData/Swift/ReaderSiteTopic.swift index 75420b0f318d..e277b3e10250 100644 --- a/Sources/WordPressData/Swift/ReaderSiteTopic.swift +++ b/Sources/WordPressData/Swift/ReaderSiteTopic.swift @@ -1,6 +1,7 @@ import Foundation -@objc open class ReaderSiteTopic: ReaderAbstractTopic { +@objc(ReaderSiteTopic) +open class ReaderSiteTopic: ReaderAbstractTopic { // Relations @NSManaged open var postSubscription: ReaderSiteInfoSubscriptionPost? @NSManaged open var emailSubscription: ReaderSiteInfoSubscriptionEmail? diff --git a/Sources/WordPressData/Swift/ReaderTagTopic.swift b/Sources/WordPressData/Swift/ReaderTagTopic.swift index 41e39e7da61c..2d8ff72f5aa0 100644 --- a/Sources/WordPressData/Swift/ReaderTagTopic.swift +++ b/Sources/WordPressData/Swift/ReaderTagTopic.swift @@ -1,6 +1,7 @@ import Foundation -@objc open class ReaderTagTopic: ReaderAbstractTopic { +@objc(ReaderTagTopic) +open class ReaderTagTopic: ReaderAbstractTopic { @NSManaged open var isRecommended: Bool @NSManaged open var slug: String @NSManaged open var tagID: NSNumber diff --git a/Sources/WordPressData/Swift/ReaderTeamTopic.swift b/Sources/WordPressData/Swift/ReaderTeamTopic.swift new file mode 100644 index 000000000000..0a952ba49cb9 --- /dev/null +++ b/Sources/WordPressData/Swift/ReaderTeamTopic.swift @@ -0,0 +1,18 @@ +import Foundation + +@objc(ReaderTeamTopic) +open class ReaderTeamTopic: ReaderAbstractTopic { + @NSManaged open var slug: String + @NSManaged open var organizationID: Int + + override open class var TopicType: String { + return "organization" + } + + public var organizationType: SiteOrganizationType { + return SiteOrganizationType(rawValue: organizationID) ?? .none + } + + public static let a8cSlug = "a8c" + public static let p2Slug = "p2" +} diff --git a/Sources/WordPressData/Swift/SharingButton.swift b/Sources/WordPressData/Swift/SharingButton.swift index 1b58efae2a11..c4bf70f7018d 100644 --- a/Sources/WordPressData/Swift/SharingButton.swift +++ b/Sources/WordPressData/Swift/SharingButton.swift @@ -1,7 +1,8 @@ import Foundation import CoreData -@objc open class SharingButton: NSManagedObject { +@objc(SharingButton) +open class SharingButton: NSManagedObject { @objc public static let visible = "visible" @objc public static let hidden = "hidden" diff --git a/Sources/WordPressData/Swift/SiteInfo.swift b/Sources/WordPressData/Swift/SiteInfo.swift deleted file mode 100644 index c0f2ec4d0be6..000000000000 --- a/Sources/WordPressData/Swift/SiteInfo.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation - -@objc open class SiteInfo: NSObject { - @objc var name = "" - @objc var tagline = "" - @objc var url = "" - @objc var hasJetpack = false - @objc var icon = "" -} diff --git a/Sources/WordPressData/Swift/WordPressComRestApi+Defaults.swift b/Sources/WordPressData/Swift/WordPressComRestApi+Defaults.swift index 012488b2c43a..f7e80b761e3c 100644 --- a/Sources/WordPressData/Swift/WordPressComRestApi+Defaults.swift +++ b/Sources/WordPressData/Swift/WordPressComRestApi+Defaults.swift @@ -9,7 +9,7 @@ extension WordPressComRestApi { return WordPressComRestApi(oAuthToken: oAuthToken, userAgent: userAgent, localeKey: localeKey, - baseURL: WordPressComRestApi.apiBaseURL) + baseURL: AppEnvironment.current.wordPressComApiBase) } /// Returns the default API the default WP.com account using the given context diff --git a/Tests/KeystoneTests/Tests/CoreData/ContextManagerTests.swift b/Tests/KeystoneTests/Tests/CoreData/ContextManagerTests.swift index a43a51b87e04..cda2296df400 100644 --- a/Tests/KeystoneTests/Tests/CoreData/ContextManagerTests.swift +++ b/Tests/KeystoneTests/Tests/CoreData/ContextManagerTests.swift @@ -445,7 +445,7 @@ class ContextManagerTests: XCTestCase { } fileprivate func urlForModelName(_ name: String) -> URL? { - let bundle = Bundle(for: ContextManager.self) + let bundle = Bundle.wordPressData var url = bundle.url(forResource: name, withExtension: "mom") if url == nil { diff --git a/Tests/KeystoneTests/Tests/CoreData/CoreDataMigrationTests.m b/Tests/KeystoneTests/Tests/CoreData/CoreDataMigrationTests.m index 1b48f87eea4f..397d37da9845 100644 --- a/Tests/KeystoneTests/Tests/CoreData/CoreDataMigrationTests.m +++ b/Tests/KeystoneTests/Tests/CoreData/CoreDataMigrationTests.m @@ -217,13 +217,13 @@ - (void)testMigrationFrom103To104CustomTransformers - (NSURL *)urlForModelName:(NSString*)modelName inDirectory:(NSString*)directory { - NSBundle *bundle = [NSBundle mainBundle]; + NSBundle *bundle = [NSBundle wordPressData]; NSURL *url = [bundle URLForResource:modelName withExtension:@"mom" subdirectory:directory]; if (nil == url) { // Get mom file paths from momd directories. - NSArray *momdPaths = [[NSBundle mainBundle] pathsForResourcesOfType:@"momd" + NSArray *momdPaths = [[NSBundle wordPressData] pathsForResourcesOfType:@"momd" inDirectory:directory]; for (NSString *momdPath in momdPaths) { url = [bundle URLForResource:modelName diff --git a/Tests/KeystoneTests/Tests/Jetpack/DataMigratorTests.swift b/Tests/KeystoneTests/Tests/Jetpack/DataMigratorTests.swift index 4fd2c3caf146..239796887fe1 100644 --- a/Tests/KeystoneTests/Tests/Jetpack/DataMigratorTests.swift +++ b/Tests/KeystoneTests/Tests/Jetpack/DataMigratorTests.swift @@ -259,7 +259,7 @@ private extension DataMigratorTests { static let defaultsWrapperKey = "defaults_staging_dictionary" } - func createContext(for model: NSManagedObjectModel = NSManagedObjectModel.mergedModel(from: [Bundle.main])!, + func createContext(for model: NSManagedObjectModel = NSManagedObjectModel.mergedModel(from: [Bundle.wordPressData])!, type: String = NSInMemoryStoreType, at location: URL? = nil) throws -> NSManagedObjectContext { let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: model) @@ -288,7 +288,7 @@ private extension DataMigratorTests { } func getModelNames() -> [String] { - guard let modelFileURL = Bundle.main.url(forResource: "WordPress", withExtension: "momd"), + guard let modelFileURL = Bundle.wordPressData.url(forResource: "WordPress", withExtension: "momd"), let versionInfo = NSDictionary(contentsOf: modelFileURL.appendingPathComponent("VersionInfo.plist")), let modelNames = (versionInfo["NSManagedObjectModel_VersionHashes"] as? [String: AnyObject])?.keys else { return [] @@ -305,13 +305,13 @@ private extension DataMigratorTests { } func urlForModel(name: String) -> URL? { - if let url = Bundle.main.url(forResource: name, withExtension: "mom") { + if let url = Bundle.wordPressData.url(forResource: name, withExtension: "mom") { return url } - let momdPaths = Bundle.main.paths(forResourcesOfType: "momd", inDirectory: nil) + let momdPaths = Bundle.wordPressData.paths(forResourcesOfType: "momd", inDirectory: nil) for path in momdPaths { - if let url = Bundle.main.url(forResource: name, withExtension: "mom", subdirectory: URL(fileURLWithPath: path).lastPathComponent) { + if let url = Bundle.wordPressData.url(forResource: name, withExtension: "mom", subdirectory: URL(fileURLWithPath: path).lastPathComponent) { return url } } diff --git a/WordPress/Classes/Models/ReaderTeamTopic.swift b/WordPress/Classes/Models/ReaderTeamTopic.swift deleted file mode 100644 index b821f85c129f..000000000000 --- a/WordPress/Classes/Models/ReaderTeamTopic.swift +++ /dev/null @@ -1,21 +0,0 @@ -import Foundation - -@objc open class ReaderTeamTopic: ReaderAbstractTopic { - @NSManaged open var slug: String - @NSManaged open var organizationID: Int - - override open class var TopicType: String { - return "organization" - } - - var shownTrackEvent: WPAnalyticsEvent { - return slug == ReaderTeamTopic.a8cSlug ? .readerA8CShown : .readerP2Shown - } - - var organizationType: SiteOrganizationType { - return SiteOrganizationType(rawValue: organizationID) ?? .none - } - - static let a8cSlug = "a8c" - static let p2Slug = "p2" -} diff --git a/WordPress/Classes/Utility/Editor/GutenbergSettings.swift b/WordPress/Classes/Utility/Editor/GutenbergSettings.swift index 5a0b35ff812e..d06f7aadc3ad 100644 --- a/WordPress/Classes/Utility/Editor/GutenbergSettings.swift +++ b/WordPress/Classes/Utility/Editor/GutenbergSettings.swift @@ -1,3 +1,4 @@ +import Foundation import WordPressShared /// Takes care of storing and accessing Gutenberg settings. diff --git a/WordPress/Classes/ViewRelated/NUX/Helpers/WordPressAuthenticationManager.swift b/WordPress/Classes/ViewRelated/NUX/Helpers/WordPressAuthenticationManager.swift index dd5ba15703de..04e9290b95c5 100644 --- a/WordPress/Classes/ViewRelated/NUX/Helpers/WordPressAuthenticationManager.swift +++ b/WordPress/Classes/ViewRelated/NUX/Helpers/WordPressAuthenticationManager.swift @@ -2,6 +2,7 @@ import UIKit import BuildSettingsKit import SFHFKeychainUtils import WordPressAuthenticator +import WordPressData import WordPressShared import WordPressUI import Gridicons diff --git a/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderHelpers.swift b/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderHelpers.swift index c4a9e3cf7e36..c77be9238fc6 100644 --- a/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderHelpers.swift +++ b/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderHelpers.swift @@ -178,7 +178,7 @@ struct ReaderNotificationKeys { stat = .readerTagLoaded } else if let teamTopic = topic as? ReaderTeamTopic { - WPAnalytics.trackReader(teamTopic.shownTrackEvent, properties: properties) + WPAnalytics.trackReader(teamTopic.slug == ReaderTeamTopic.a8cSlug ? .readerA8CShown : .readerP2Shown, properties: properties) } if stat != nil {