From 99868e3ecae40d5325834b3fe91b0e1734eb0a03 Mon Sep 17 00:00:00 2001 From: Thibault Wittemberg Date: Mon, 28 Aug 2017 09:50:47 -0400 Subject: [PATCH 1/4] disposeBag: add a HasDisposeBag protocol In this commit, we try to conform to protocol oriented programming. It is more flexible to introduce a HasDisposeBag protocol so that every object that respect this one can have a DisposeBag (NSObject does respect that protocol now) --- .gitignore | 4 + NSObject+Rx.swift | 44 ----- NSObject-Rx.xcodeproj/project.pbxproj | 167 +++++++++++++++++- .../xcschemes/NSObject_Rx.xcscheme | 37 +++- NSObject_Rx/DisposeBagable.swift | 53 ++++++ NSObject_Rx/NSObject+Rx.swift | 18 ++ NSObject_RxTests/Info.plist | 22 +++ NSObject_RxTests/NSObject_RxTests.swift | 52 ++++++ Readme.md | 2 + 9 files changed, 350 insertions(+), 49 deletions(-) delete mode 100644 NSObject+Rx.swift create mode 100644 NSObject_Rx/DisposeBagable.swift create mode 100644 NSObject_Rx/NSObject+Rx.swift create mode 100644 NSObject_RxTests/Info.plist create mode 100644 NSObject_RxTests/NSObject_RxTests.swift diff --git a/.gitignore b/.gitignore index bb3409d..629b487 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,7 @@ Pods/ # Add this line if you want to avoid checking in source code from Carthage dependencies. Carthage/Checkouts Carthage/Build + +# MacOS +# +.DS_Store diff --git a/NSObject+Rx.swift b/NSObject+Rx.swift deleted file mode 100644 index 1d0669f..0000000 --- a/NSObject+Rx.swift +++ /dev/null @@ -1,44 +0,0 @@ -import Foundation -import RxSwift -import ObjectiveC - -public extension NSObject { - fileprivate struct AssociatedKeys { - static var DisposeBag = "rx_disposeBag" - } - - fileprivate func doLocked(_ closure: () -> Void) { - objc_sync_enter(self); defer { objc_sync_exit(self) } - closure() - } - - var rx_disposeBag: DisposeBag { - get { - var disposeBag: DisposeBag! - doLocked { - let lookup = objc_getAssociatedObject(self, &AssociatedKeys.DisposeBag) as? DisposeBag - if let lookup = lookup { - disposeBag = lookup - } else { - let newDisposeBag = DisposeBag() - self.rx_disposeBag = newDisposeBag - disposeBag = newDisposeBag - } - } - return disposeBag - } - - set { - doLocked { - objc_setAssociatedObject(self, &AssociatedKeys.DisposeBag, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - } - } - } -} - -public extension Reactive where Base: NSObject { - var disposeBag: DisposeBag { - get { return base.rx_disposeBag } - set { base.rx_disposeBag = newValue } - } -} diff --git a/NSObject-Rx.xcodeproj/project.pbxproj b/NSObject-Rx.xcodeproj/project.pbxproj index db1eaf8..e621aa0 100644 --- a/NSObject-Rx.xcodeproj/project.pbxproj +++ b/NSObject-Rx.xcodeproj/project.pbxproj @@ -10,14 +10,46 @@ 188C6D941C47B2B20092101A /* NSObject_Rx.h in Headers */ = {isa = PBXBuildFile; fileRef = 188C6D931C47B2B20092101A /* NSObject_Rx.h */; settings = {ATTRIBUTES = (Public, ); }; }; 188C6D9F1C47B2D00092101A /* NSObject+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 188C6D9E1C47B2D00092101A /* NSObject+Rx.swift */; }; 188C6DA31C47B4240092101A /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 188C6DA21C47B4240092101A /* RxSwift.framework */; }; + 1AE62D711F50AE200011BA4F /* DisposeBagable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AE62D701F50AE200011BA4F /* DisposeBagable.swift */; }; + 1AE62DB51F50C2090011BA4F /* NSObject_RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AE62DB41F50C2090011BA4F /* NSObject_RxTests.swift */; }; + 1AE62DB71F50C2090011BA4F /* NSObject_Rx.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 188C6D911C47B2B20092101A /* NSObject_Rx.framework */; }; + 1AE62DC01F50C8230011BA4F /* RxSwift.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1AE62DBF1F50C8230011BA4F /* RxSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 1AE62DB81F50C2090011BA4F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 18EE7A101C47B12F00C7256C /* Project object */; + proxyType = 1; + remoteGlobalIDString = 188C6D901C47B2B20092101A; + remoteInfo = NSObject_Rx; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 1AE62DBE1F50C7FB0011BA4F /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 1AE62DC01F50C8230011BA4F /* RxSwift.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 188C6D911C47B2B20092101A /* NSObject_Rx.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NSObject_Rx.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 188C6D931C47B2B20092101A /* NSObject_Rx.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSObject_Rx.h; sourceTree = ""; }; 188C6D951C47B2B20092101A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 188C6D9E1C47B2D00092101A /* NSObject+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSObject+Rx.swift"; sourceTree = SOURCE_ROOT; }; + 188C6D9E1C47B2D00092101A /* NSObject+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx.swift"; path = "NSObject_Rx/NSObject+Rx.swift"; sourceTree = SOURCE_ROOT; }; 188C6DA21C47B4240092101A /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/iOS/RxSwift.framework; sourceTree = SOURCE_ROOT; }; + 1AE62D701F50AE200011BA4F /* DisposeBagable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisposeBagable.swift; sourceTree = ""; }; + 1AE62DB21F50C2090011BA4F /* NSObject_RxTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NSObject_RxTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1AE62DB41F50C2090011BA4F /* NSObject_RxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSObject_RxTests.swift; sourceTree = ""; }; + 1AE62DB61F50C2090011BA4F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1AE62DBF1F50C8230011BA4F /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/iOS/RxSwift.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -29,6 +61,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1AE62DAF1F50C2090011BA4F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1AE62DB71F50C2090011BA4F /* NSObject_Rx.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -38,6 +78,7 @@ 188C6DA21C47B4240092101A /* RxSwift.framework */, 188C6D9E1C47B2D00092101A /* NSObject+Rx.swift */, 188C6D931C47B2B20092101A /* NSObject_Rx.h */, + 1AE62D701F50AE200011BA4F /* DisposeBagable.swift */, 188C6D951C47B2B20092101A /* Info.plist */, ); path = NSObject_Rx; @@ -46,7 +87,9 @@ 18EE7A0F1C47B12F00C7256C = { isa = PBXGroup; children = ( + 1AE62DBF1F50C8230011BA4F /* RxSwift.framework */, 188C6D921C47B2B20092101A /* NSObject_Rx */, + 1AE62DB31F50C2090011BA4F /* NSObject_RxTests */, 18EE7A191C47B12F00C7256C /* Products */, ); sourceTree = ""; @@ -55,10 +98,20 @@ isa = PBXGroup; children = ( 188C6D911C47B2B20092101A /* NSObject_Rx.framework */, + 1AE62DB21F50C2090011BA4F /* NSObject_RxTests.xctest */, ); name = Products; sourceTree = ""; }; + 1AE62DB31F50C2090011BA4F /* NSObject_RxTests */ = { + isa = PBXGroup; + children = ( + 1AE62DB41F50C2090011BA4F /* NSObject_RxTests.swift */, + 1AE62DB61F50C2090011BA4F /* Info.plist */, + ); + path = NSObject_RxTests; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -91,20 +144,43 @@ productReference = 188C6D911C47B2B20092101A /* NSObject_Rx.framework */; productType = "com.apple.product-type.framework"; }; + 1AE62DB11F50C2090011BA4F /* NSObject_RxTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1AE62DBA1F50C2090011BA4F /* Build configuration list for PBXNativeTarget "NSObject_RxTests" */; + buildPhases = ( + 1AE62DAE1F50C2090011BA4F /* Sources */, + 1AE62DAF1F50C2090011BA4F /* Frameworks */, + 1AE62DB01F50C2090011BA4F /* Resources */, + 1AE62DBE1F50C7FB0011BA4F /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 1AE62DB91F50C2090011BA4F /* PBXTargetDependency */, + ); + name = NSObject_RxTests; + productName = NSObject_RxTests; + productReference = 1AE62DB21F50C2090011BA4F /* NSObject_RxTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 18EE7A101C47B12F00C7256C /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0720; + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = RxSwiftCommunity; TargetAttributes = { 188C6D901C47B2B20092101A = { CreatedOnToolsVersion = 7.2; LastSwiftMigration = 0800; }; + 1AE62DB11F50C2090011BA4F = { + CreatedOnToolsVersion = 8.3.3; + ProvisioningStyle = Automatic; + }; }; }; buildConfigurationList = 18EE7A131C47B12F00C7256C /* Build configuration list for PBXProject "NSObject-Rx" */; @@ -121,6 +197,7 @@ projectRoot = ""; targets = ( 188C6D901C47B2B20092101A /* NSObject_Rx */, + 1AE62DB11F50C2090011BA4F /* NSObject_RxTests */, ); }; /* End PBXProject section */ @@ -133,6 +210,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1AE62DB01F50C2090011BA4F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -140,17 +224,35 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1AE62D711F50AE200011BA4F /* DisposeBagable.swift in Sources */, 188C6D9F1C47B2D00092101A /* NSObject+Rx.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; + 1AE62DAE1F50C2090011BA4F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1AE62DB51F50C2090011BA4F /* NSObject_RxTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 1AE62DB91F50C2090011BA4F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 188C6D901C47B2B20092101A /* NSObject_Rx */; + targetProxy = 1AE62DB81F50C2090011BA4F /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ 188C6D9B1C47B2B20092101A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -179,6 +281,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -215,8 +318,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -259,8 +364,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -279,10 +386,55 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.2; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; VALIDATE_PRODUCT = YES; }; name = Release; }; + 1AE62DBB1F50C2090011BA4F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = NSObject_RxTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "RxSwiftCommunity.NSObject-Rx.NSObject-RxTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 1AE62DBC1F50C2090011BA4F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = NSObject_RxTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "RxSwiftCommunity.NSObject-Rx.NSObject-RxTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -304,6 +456,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 1AE62DBA1F50C2090011BA4F /* Build configuration list for PBXNativeTarget "NSObject_RxTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1AE62DBB1F50C2090011BA4F /* Debug */, + 1AE62DBC1F50C2090011BA4F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 18EE7A101C47B12F00C7256C /* Project object */; diff --git a/NSObject-Rx.xcodeproj/xcshareddata/xcschemes/NSObject_Rx.xcscheme b/NSObject-Rx.xcodeproj/xcshareddata/xcschemes/NSObject_Rx.xcscheme index 42e5bb7..132b2e4 100644 --- a/NSObject-Rx.xcodeproj/xcshareddata/xcschemes/NSObject_Rx.xcscheme +++ b/NSObject-Rx.xcodeproj/xcshareddata/xcschemes/NSObject_Rx.xcscheme @@ -1,13 +1,13 @@ + + + + + + + + + + + + diff --git a/NSObject_Rx/DisposeBagable.swift b/NSObject_Rx/DisposeBagable.swift new file mode 100644 index 0000000..043bd1e --- /dev/null +++ b/NSObject_Rx/DisposeBagable.swift @@ -0,0 +1,53 @@ +// +// DisposeBagable.swift +// NSObject-Rx +// +// Created by Thibault Wittemberg on 2017-08-25. +// Copyright © 2017 RxSwiftCommunity. All rights reserved. +// + +import Foundation +import RxSwift +import ObjectiveC + +fileprivate struct AssociatedKeys { + static var disposeBag = "disposeBag" +} + +/// each DisposeBagable offers a unique Rx DisposeBag instance +public protocol HasDisposeBag { + + /// a unique Rx DisposeBag instance + var disposeBag: DisposeBag { get set } +} + +extension HasDisposeBag { + + private func doLocked(forClosure closure: () -> Void) { + objc_sync_enter(self); defer { objc_sync_exit(self) } + closure() + } + + public var disposeBag: DisposeBag { + get { + var rxDisposeBag: DisposeBag! + doLocked { + let lookup = objc_getAssociatedObject(self, &AssociatedKeys.disposeBag) as? DisposeBag + if let lookup = lookup { + rxDisposeBag = lookup + } else { + let newDisposeBag = DisposeBag() + objc_setAssociatedObject(self, &AssociatedKeys.disposeBag, newDisposeBag, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + rxDisposeBag = newDisposeBag + } + } + return rxDisposeBag + } + + set { + doLocked { + objc_setAssociatedObject(self, &AssociatedKeys.disposeBag, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + } +} diff --git a/NSObject_Rx/NSObject+Rx.swift b/NSObject_Rx/NSObject+Rx.swift new file mode 100644 index 0000000..ac14a4a --- /dev/null +++ b/NSObject_Rx/NSObject+Rx.swift @@ -0,0 +1,18 @@ +import Foundation +import RxSwift +import ObjectiveC + +extension NSObject: HasDisposeBag { +} + +public extension Reactive where Base: HasDisposeBag { + + /// a unique DisposeBag that is related to the Reactive.Base instance + var disposeBag: DisposeBag { + get { return base.disposeBag } + set { + var mutableBase = base + mutableBase.disposeBag = newValue + } + } +} diff --git a/NSObject_RxTests/Info.plist b/NSObject_RxTests/Info.plist new file mode 100644 index 0000000..6c6c23c --- /dev/null +++ b/NSObject_RxTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/NSObject_RxTests/NSObject_RxTests.swift b/NSObject_RxTests/NSObject_RxTests.swift new file mode 100644 index 0000000..9e75944 --- /dev/null +++ b/NSObject_RxTests/NSObject_RxTests.swift @@ -0,0 +1,52 @@ +// +// NSObject_RxTests.swift +// NSObject_RxTests +// +// Created by Thibault Wittemberg on 2017-08-25. +// Copyright © 2017 RxSwiftCommunity. All rights reserved. +// + +import XCTest +import RxSwift +@testable import NSObject_Rx + +class MockNSObject: NSObject { +} + +class DisposableObject: HasDisposeBag { +} + +class NSObject_RxTests: XCTestCase { + + private var mockNSObject: MockNSObject! + private var disposableObject: DisposableObject! + + override func setUp() { + super.setUp() + self.mockNSObject = MockNSObject() + self.disposableObject = DisposableObject() + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testNSObject() { + XCTAssertNotNil(self.mockNSObject.rx.disposeBag) + let newDisposeBag = DisposeBag() + self.mockNSObject.rx.disposeBag = newDisposeBag + let address1 = Unmanaged.passUnretained(self.mockNSObject.rx.disposeBag as AnyObject).toOpaque() + let address2 = Unmanaged.passUnretained(newDisposeBag as AnyObject).toOpaque() + XCTAssert(address1 == address2) + } + + func testDisposeBagable() { + XCTAssertNotNil(self.disposableObject.disposeBag) + let newDisposeBag = DisposeBag() + self.disposableObject.disposeBag = newDisposeBag + let address1 = Unmanaged.passUnretained(self.disposableObject.disposeBag as AnyObject).toOpaque() + let address2 = Unmanaged.passUnretained(newDisposeBag as AnyObject).toOpaque() + XCTAssert(address1 == address2) + } +} diff --git a/Readme.md b/Readme.md index 1f1ac36..cad6407 100644 --- a/Readme.md +++ b/Readme.md @@ -29,6 +29,8 @@ Sweet. It'll work just like a property: when the instance is deinit'd, the `DisposeBag` gets disposed. It's also a read/write property, so you can use your own, too. +If you want to add a DisposeBag to an Object that does not inherit from NSObject, you can also implement the protocol `HasDisposeBag`, and you're good to go. This protocol provides a default DisposeBag called `disposeBag`. + Installing ---------- From cb1368f7a2730197a69ed6e8958d187ba7e44016 Mon Sep 17 00:00:00 2001 From: Ash Furrow Date: Thu, 31 Aug 2017 11:41:59 -0400 Subject: [PATCH 2/4] Moves tests back into CocoaPods project, fixes CocoaPods integration. --- Changelog.md | 3 + Demo/Demo.xcodeproj/project.pbxproj | 23 ++- Demo/DemoTests/DemoTests.swift | 8 +- .../DemoTests/ProtocolTests.swift | 13 +- Demo/Podfile.lock | 10 +- ...sposeBagable.swift => DisposeBagable.swift | 0 .../NSObject+Rx.swift => NSObject+Rx.swift | 0 NSObject-Rx.xcodeproj/project.pbxproj | 174 +----------------- NSObject_Rx/Info.plist | 26 --- NSObject_Rx/NSObject_Rx.h | 19 -- NSObject_RxTests/Info.plist | 22 --- 11 files changed, 45 insertions(+), 253 deletions(-) rename NSObject_RxTests/NSObject_RxTests.swift => Demo/DemoTests/ProtocolTests.swift (89%) rename NSObject_Rx/DisposeBagable.swift => DisposeBagable.swift (100%) rename NSObject_Rx/NSObject+Rx.swift => NSObject+Rx.swift (100%) delete mode 100644 NSObject_Rx/Info.plist delete mode 100644 NSObject_Rx/NSObject_Rx.h delete mode 100644 NSObject_RxTests/Info.plist diff --git a/Changelog.md b/Changelog.md index 8773a82..eddce01 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,9 @@ Changelog Current master -------------- +- Move to a new protocol-based approach, allowing non-reference types to use the library 🎉 See [#41](https://github.com/RxSwiftCommunity/NSObject-Rx/pull/41) - [@twittemb](https://github.com/twittemb) +- Removes `rx_disposeBag` in favour of `rx.disposeBag`. + 2.3.0 ----- - Make rx.disposeBag read/write ([#40](https://github.com/RxSwiftCommunity/NSObject-Rx/pull/40)) - [@freak4pc](https://github.com/freak4pc) diff --git a/Demo/Demo.xcodeproj/project.pbxproj b/Demo/Demo.xcodeproj/project.pbxproj index 4752874..e95ee5f 100644 --- a/Demo/Demo.xcodeproj/project.pbxproj +++ b/Demo/Demo.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 4782C2FD3F28267D0A736242 /* Pods_DemoTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98ABDE1166974D890C0D32DA /* Pods_DemoTests.framework */; }; + 5E6ACB541F5863D30050E957 /* ProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E6ACB531F5863D30050E957 /* ProtocolTests.swift */; }; 5E9E831F1BF79B3000C85B46 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E9E831E1BF79B3000C85B46 /* AppDelegate.swift */; }; 5E9E83211BF79B3000C85B46 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E9E83201BF79B3000C85B46 /* ViewController.swift */; }; 5E9E83241BF79B3000C85B46 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5E9E83221BF79B3000C85B46 /* Main.storyboard */; }; @@ -31,6 +32,7 @@ 1E9B7B66986C52EC97B65AAF /* Pods-Demo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Demo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Demo/Pods-Demo.debug.xcconfig"; sourceTree = ""; }; 371C581F5871A4EEFB5D8274 /* Pods-DemoTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DemoTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-DemoTests/Pods-DemoTests.release.xcconfig"; sourceTree = ""; }; 579EF2C5ACCE845BC7962A04 /* Pods-Demo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Demo.release.xcconfig"; path = "Pods/Target Support Files/Pods-Demo/Pods-Demo.release.xcconfig"; sourceTree = ""; }; + 5E6ACB531F5863D30050E957 /* ProtocolTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProtocolTests.swift; sourceTree = ""; }; 5E9E831B1BF79B3000C85B46 /* Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5E9E831E1BF79B3000C85B46 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 5E9E83201BF79B3000C85B46 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -104,6 +106,7 @@ children = ( 5E9E83331BF79B3000C85B46 /* DemoTests.swift */, 5E9E83351BF79B3000C85B46 /* Info.plist */, + 5E6ACB531F5863D30050E957 /* ProtocolTests.swift */, ); path = DemoTests; sourceTree = ""; @@ -251,13 +254,16 @@ files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Demo-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 9FB93DCD00D21C3B467F9BEF /* [CP] Copy Pods Resources */ = { @@ -296,13 +302,16 @@ files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-DemoTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; FFDE61183A484AA609E96F39 /* [CP] Embed Pods Frameworks */ = { @@ -311,9 +320,18 @@ files = ( ); inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-DemoTests/Pods-DemoTests-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/NSObject+Rx/NSObject_Rx.framework", + "${BUILT_PRODUCTS_DIR}/Nimble/Nimble.framework", + "${BUILT_PRODUCTS_DIR}/Quick/Quick.framework", + "${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NSObject_Rx.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Nimble.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Quick.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -337,6 +355,7 @@ buildActionMask = 2147483647; files = ( 5E9E83341BF79B3000C85B46 /* DemoTests.swift in Sources */, + 5E6ACB541F5863D30050E957 /* ProtocolTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Demo/DemoTests/DemoTests.swift b/Demo/DemoTests/DemoTests.swift index dc203bc..f4a3749 100644 --- a/Demo/DemoTests/DemoTests.swift +++ b/Demo/DemoTests/DemoTests.swift @@ -6,11 +6,11 @@ import NSObject_Rx class Test: QuickSpec { override func spec() { it("respects setter") { - let subject = NSObject() + var subject = NSObject() let disposeBag = DisposeBag() - subject.rx_disposeBag = disposeBag + subject.rx.disposeBag = disposeBag - expect(subject.rx_disposeBag) === disposeBag + expect(subject.rx.disposeBag) === disposeBag } it("diposes when object is deallocated") { @@ -22,7 +22,7 @@ class Test: QuickSpec { let subject = NSObject() variable.subscribe(onNext: { _ in executed = true - }).addDisposableTo(subject.rx_disposeBag) + }).addDisposableTo(subject.rx.disposeBag) } // Force a new value through the subscription to test its been disposed of. diff --git a/NSObject_RxTests/NSObject_RxTests.swift b/Demo/DemoTests/ProtocolTests.swift similarity index 89% rename from NSObject_RxTests/NSObject_RxTests.swift rename to Demo/DemoTests/ProtocolTests.swift index 9e75944..bb2694d 100644 --- a/NSObject_RxTests/NSObject_RxTests.swift +++ b/Demo/DemoTests/ProtocolTests.swift @@ -1,11 +1,3 @@ -// -// NSObject_RxTests.swift -// NSObject_RxTests -// -// Created by Thibault Wittemberg on 2017-08-25. -// Copyright © 2017 RxSwiftCommunity. All rights reserved. -// - import XCTest import RxSwift @testable import NSObject_Rx @@ -26,12 +18,12 @@ class NSObject_RxTests: XCTestCase { self.mockNSObject = MockNSObject() self.disposableObject = DisposableObject() } - + override func tearDown() { // Put teardown code here. This method is called after the invocation of each test method in the class. super.tearDown() } - + func testNSObject() { XCTAssertNotNil(self.mockNSObject.rx.disposeBag) let newDisposeBag = DisposeBag() @@ -50,3 +42,4 @@ class NSObject_RxTests: XCTestCase { XCTAssert(address1 == address2) } } + diff --git a/Demo/Podfile.lock b/Demo/Podfile.lock index 2a6a13f..598000a 100644 --- a/Demo/Podfile.lock +++ b/Demo/Podfile.lock @@ -1,7 +1,7 @@ PODS: - Nimble (6.1.0) - - NSObject+Rx (2.2.0): - - RxSwift + - NSObject+Rx (2.3.0): + - RxSwift (~> 3.0) - Quick (1.1.0) - RxSwift (3.0.1) @@ -13,14 +13,14 @@ DEPENDENCIES: EXTERNAL SOURCES: NSObject+Rx: - :path: "../" + :path: ../ SPEC CHECKSUMS: Nimble: c53e6903fee94041b90ded74f135820437d8bf59 - NSObject+Rx: be98a305d3c488a7b8da6fc38c0c64aba70514cf + NSObject+Rx: a73d1851aede1776223a4543025dc25a001e8b2a Quick: dafc587e21eed9f4cab3249b9f9015b0b7a7f71d RxSwift: af5680055c4ad04480189c52d28385b1029493a6 PODFILE CHECKSUM: 0505237e77e025183988e56cdaa4bb98c27d03ba -COCOAPODS: 1.2.1 +COCOAPODS: 1.3.0.beta.2 diff --git a/NSObject_Rx/DisposeBagable.swift b/DisposeBagable.swift similarity index 100% rename from NSObject_Rx/DisposeBagable.swift rename to DisposeBagable.swift diff --git a/NSObject_Rx/NSObject+Rx.swift b/NSObject+Rx.swift similarity index 100% rename from NSObject_Rx/NSObject+Rx.swift rename to NSObject+Rx.swift diff --git a/NSObject-Rx.xcodeproj/project.pbxproj b/NSObject-Rx.xcodeproj/project.pbxproj index e621aa0..d5a5361 100644 --- a/NSObject-Rx.xcodeproj/project.pbxproj +++ b/NSObject-Rx.xcodeproj/project.pbxproj @@ -7,49 +7,17 @@ objects = { /* Begin PBXBuildFile section */ - 188C6D941C47B2B20092101A /* NSObject_Rx.h in Headers */ = {isa = PBXBuildFile; fileRef = 188C6D931C47B2B20092101A /* NSObject_Rx.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 188C6D9F1C47B2D00092101A /* NSObject+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 188C6D9E1C47B2D00092101A /* NSObject+Rx.swift */; }; 188C6DA31C47B4240092101A /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 188C6DA21C47B4240092101A /* RxSwift.framework */; }; - 1AE62D711F50AE200011BA4F /* DisposeBagable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AE62D701F50AE200011BA4F /* DisposeBagable.swift */; }; - 1AE62DB51F50C2090011BA4F /* NSObject_RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AE62DB41F50C2090011BA4F /* NSObject_RxTests.swift */; }; - 1AE62DB71F50C2090011BA4F /* NSObject_Rx.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 188C6D911C47B2B20092101A /* NSObject_Rx.framework */; }; - 1AE62DC01F50C8230011BA4F /* RxSwift.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1AE62DBF1F50C8230011BA4F /* RxSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 5E6ACB5B1F58657A0050E957 /* DisposeBagable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E6ACB591F58657A0050E957 /* DisposeBagable.swift */; }; + 5E6ACB5C1F58657A0050E957 /* NSObject+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E6ACB5A1F58657A0050E957 /* NSObject+Rx.swift */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 1AE62DB81F50C2090011BA4F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 18EE7A101C47B12F00C7256C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 188C6D901C47B2B20092101A; - remoteInfo = NSObject_Rx; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 1AE62DBE1F50C7FB0011BA4F /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 1AE62DC01F50C8230011BA4F /* RxSwift.framework in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - /* Begin PBXFileReference section */ 188C6D911C47B2B20092101A /* NSObject_Rx.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NSObject_Rx.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 188C6D931C47B2B20092101A /* NSObject_Rx.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSObject_Rx.h; sourceTree = ""; }; - 188C6D951C47B2B20092101A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 188C6D9E1C47B2D00092101A /* NSObject+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx.swift"; path = "NSObject_Rx/NSObject+Rx.swift"; sourceTree = SOURCE_ROOT; }; 188C6DA21C47B4240092101A /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/iOS/RxSwift.framework; sourceTree = SOURCE_ROOT; }; - 1AE62D701F50AE200011BA4F /* DisposeBagable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisposeBagable.swift; sourceTree = ""; }; - 1AE62DB21F50C2090011BA4F /* NSObject_RxTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NSObject_RxTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1AE62DB41F50C2090011BA4F /* NSObject_RxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSObject_RxTests.swift; sourceTree = ""; }; - 1AE62DB61F50C2090011BA4F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1AE62DBF1F50C8230011BA4F /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/iOS/RxSwift.framework; sourceTree = ""; }; + 5E6ACB591F58657A0050E957 /* DisposeBagable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisposeBagable.swift; sourceTree = SOURCE_ROOT; }; + 5E6ACB5A1F58657A0050E957 /* NSObject+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSObject+Rx.swift"; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -61,25 +29,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 1AE62DAF1F50C2090011BA4F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1AE62DB71F50C2090011BA4F /* NSObject_Rx.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 188C6D921C47B2B20092101A /* NSObject_Rx */ = { isa = PBXGroup; children = ( + 5E6ACB591F58657A0050E957 /* DisposeBagable.swift */, + 5E6ACB5A1F58657A0050E957 /* NSObject+Rx.swift */, 188C6DA21C47B4240092101A /* RxSwift.framework */, - 188C6D9E1C47B2D00092101A /* NSObject+Rx.swift */, - 188C6D931C47B2B20092101A /* NSObject_Rx.h */, - 1AE62D701F50AE200011BA4F /* DisposeBagable.swift */, - 188C6D951C47B2B20092101A /* Info.plist */, ); path = NSObject_Rx; sourceTree = ""; @@ -89,7 +47,6 @@ children = ( 1AE62DBF1F50C8230011BA4F /* RxSwift.framework */, 188C6D921C47B2B20092101A /* NSObject_Rx */, - 1AE62DB31F50C2090011BA4F /* NSObject_RxTests */, 18EE7A191C47B12F00C7256C /* Products */, ); sourceTree = ""; @@ -98,20 +55,10 @@ isa = PBXGroup; children = ( 188C6D911C47B2B20092101A /* NSObject_Rx.framework */, - 1AE62DB21F50C2090011BA4F /* NSObject_RxTests.xctest */, ); name = Products; sourceTree = ""; }; - 1AE62DB31F50C2090011BA4F /* NSObject_RxTests */ = { - isa = PBXGroup; - children = ( - 1AE62DB41F50C2090011BA4F /* NSObject_RxTests.swift */, - 1AE62DB61F50C2090011BA4F /* Info.plist */, - ); - path = NSObject_RxTests; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -119,7 +66,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 188C6D941C47B2B20092101A /* NSObject_Rx.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -144,25 +90,6 @@ productReference = 188C6D911C47B2B20092101A /* NSObject_Rx.framework */; productType = "com.apple.product-type.framework"; }; - 1AE62DB11F50C2090011BA4F /* NSObject_RxTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1AE62DBA1F50C2090011BA4F /* Build configuration list for PBXNativeTarget "NSObject_RxTests" */; - buildPhases = ( - 1AE62DAE1F50C2090011BA4F /* Sources */, - 1AE62DAF1F50C2090011BA4F /* Frameworks */, - 1AE62DB01F50C2090011BA4F /* Resources */, - 1AE62DBE1F50C7FB0011BA4F /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 1AE62DB91F50C2090011BA4F /* PBXTargetDependency */, - ); - name = NSObject_RxTests; - productName = NSObject_RxTests; - productReference = 1AE62DB21F50C2090011BA4F /* NSObject_RxTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -175,11 +102,7 @@ TargetAttributes = { 188C6D901C47B2B20092101A = { CreatedOnToolsVersion = 7.2; - LastSwiftMigration = 0800; - }; - 1AE62DB11F50C2090011BA4F = { - CreatedOnToolsVersion = 8.3.3; - ProvisioningStyle = Automatic; + LastSwiftMigration = 0830; }; }; }; @@ -197,7 +120,6 @@ projectRoot = ""; targets = ( 188C6D901C47B2B20092101A /* NSObject_Rx */, - 1AE62DB11F50C2090011BA4F /* NSObject_RxTests */, ); }; /* End PBXProject section */ @@ -210,13 +132,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 1AE62DB01F50C2090011BA4F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -224,29 +139,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1AE62D711F50AE200011BA4F /* DisposeBagable.swift in Sources */, - 188C6D9F1C47B2D00092101A /* NSObject+Rx.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1AE62DAE1F50C2090011BA4F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1AE62DB51F50C2090011BA4F /* NSObject_RxTests.swift in Sources */, + 5E6ACB5B1F58657A0050E957 /* DisposeBagable.swift in Sources */, + 5E6ACB5C1F58657A0050E957 /* NSObject+Rx.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 1AE62DB91F50C2090011BA4F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 188C6D901C47B2B20092101A /* NSObject_Rx */; - targetProxy = 1AE62DB81F50C2090011BA4F /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin XCBuildConfiguration section */ 188C6D9B1C47B2B20092101A /* Debug */ = { isa = XCBuildConfiguration; @@ -262,7 +161,6 @@ "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", ); - INFOPLIST_FILE = NSObject_Rx/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -291,7 +189,6 @@ "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", ); - INFOPLIST_FILE = NSObject_Rx/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -391,50 +288,6 @@ }; name = Release; }; - 1AE62DBB1F50C2090011BA4F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = NSObject_RxTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.3; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "RxSwiftCommunity.NSObject-Rx.NSObject-RxTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - 1AE62DBC1F50C2090011BA4F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = NSObject_RxTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.3; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "RxSwiftCommunity.NSObject-Rx.NSObject-RxTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -456,15 +309,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1AE62DBA1F50C2090011BA4F /* Build configuration list for PBXNativeTarget "NSObject_RxTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1AE62DBB1F50C2090011BA4F /* Debug */, - 1AE62DBC1F50C2090011BA4F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 18EE7A101C47B12F00C7256C /* Project object */; diff --git a/NSObject_Rx/Info.plist b/NSObject_Rx/Info.plist deleted file mode 100644 index d3de8ee..0000000 --- a/NSObject_Rx/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSPrincipalClass - - - diff --git a/NSObject_Rx/NSObject_Rx.h b/NSObject_Rx/NSObject_Rx.h deleted file mode 100644 index 2f9eec1..0000000 --- a/NSObject_Rx/NSObject_Rx.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// NSObject_Rx.h -// NSObject_Rx -// -// Created by Libor Huspenina on 14/01/2016. -// Copyright © 2016 RxSwiftCommunity. All rights reserved. -// - -#import - -//! Project version number for NSObject_Rx. -FOUNDATION_EXPORT double NSObject_RxVersionNumber; - -//! Project version string for NSObject_Rx. -FOUNDATION_EXPORT const unsigned char NSObject_RxVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/NSObject_RxTests/Info.plist b/NSObject_RxTests/Info.plist deleted file mode 100644 index 6c6c23c..0000000 --- a/NSObject_RxTests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - From fd85abf63a19c4af1faf62001721dd0ac011aef1 Mon Sep 17 00:00:00 2001 From: Ash Furrow Date: Thu, 31 Aug 2017 11:43:54 -0400 Subject: [PATCH 3/4] Makes note about development. --- Readme.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Readme.md b/Readme.md index e12b843..88551f3 100644 --- a/Readme.md +++ b/Readme.md @@ -64,6 +64,11 @@ $(SRCROOT)/Carthage/Build/iOS/NSObject_Rx.framework And rule ✌️ +Contributing +------------ + +Source files are in the root directory. We use CocoaPods to develop, check out the unit tests in the Demo project. + License ------- From b8a1d88b7fe49c19e1f5f84188cdb274f80bf176 Mon Sep 17 00:00:00 2001 From: Ash Furrow Date: Thu, 31 Aug 2017 11:46:27 -0400 Subject: [PATCH 4/4] Removed unused project references. --- .../xcschemes/NSObject_Rx.xcscheme | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/NSObject-Rx.xcodeproj/xcshareddata/xcschemes/NSObject_Rx.xcscheme b/NSObject-Rx.xcodeproj/xcshareddata/xcschemes/NSObject_Rx.xcscheme index 132b2e4..2f2194c 100644 --- a/NSObject-Rx.xcodeproj/xcshareddata/xcschemes/NSObject_Rx.xcscheme +++ b/NSObject-Rx.xcodeproj/xcshareddata/xcschemes/NSObject_Rx.xcscheme @@ -20,20 +20,6 @@ ReferencedContainer = "container:NSObject-Rx.xcodeproj"> - - - - - - - -