From 24e621f4768238250d0340f804b46b5908176f00 Mon Sep 17 00:00:00 2001 From: brennoumobi Date: Fri, 10 Apr 2020 12:11:16 -0300 Subject: [PATCH] Added support to SPM --- .gitignore | 75 ++++++++---------- Example/Pods/Pods.xcodeproj/project.pbxproj | 38 ++++----- .../xcschemes/xcschememanagement.plist | 21 +++++ .../ServiceProvider.xcodeproj/project.pbxproj | 4 + .../UserInterfaceState.xcuserstate | Bin 34739 -> 41399 bytes LICENSE | 2 +- Package.swift | 29 +++++++ ServiceProvider.podspec | 6 +- ServiceProvider/Classes/ServiceKeychain.swift | 54 ------------- .../Classes/ServiceNotification.swift | 33 -------- ServiceProvider/Classes/ServiceReload.swift | 44 ---------- .../ServiceProvider}/Assets/.gitkeep | 0 .../ServiceProvider}/Classes/.gitkeep | 0 .../ServiceProvider}/Classes/Service.swift | 22 ++++- .../Classes/ServiceKeychain.swift | 68 ++++++++++++++++ .../Classes/ServiceNotification.swift | 47 +++++++++++ .../Classes/ServiceReload.swift | 58 ++++++++++++++ .../Classes/ServiceStored.swift | 22 ++++- .../Classes/ServiceStoredRx.swift | 22 ++++- Tests/LinuxMain.swift | 7 ++ .../ServiceProviderTests.swift | 15 ++++ .../XCTestManifests.swift | 9 +++ 22 files changed, 366 insertions(+), 210 deletions(-) create mode 100644 Package.swift delete mode 100644 ServiceProvider/Classes/ServiceKeychain.swift delete mode 100644 ServiceProvider/Classes/ServiceNotification.swift delete mode 100644 ServiceProvider/Classes/ServiceReload.swift rename {ServiceProvider => Sources/ServiceProvider}/Assets/.gitkeep (100%) rename {ServiceProvider => Sources/ServiceProvider}/Classes/.gitkeep (100%) rename {ServiceProvider => Sources/ServiceProvider}/Classes/Service.swift (65%) create mode 100644 Sources/ServiceProvider/Classes/ServiceKeychain.swift create mode 100644 Sources/ServiceProvider/Classes/ServiceNotification.swift create mode 100644 Sources/ServiceProvider/Classes/ServiceReload.swift rename {ServiceProvider => Sources/ServiceProvider}/Classes/ServiceStored.swift (54%) rename {ServiceProvider => Sources/ServiceProvider}/Classes/ServiceStoredRx.swift (73%) create mode 100644 Tests/LinuxMain.swift create mode 100644 Tests/ServiceProviderTests/ServiceProviderTests.swift create mode 100644 Tests/ServiceProviderTests/XCTestManifests.swift diff --git a/.gitignore b/.gitignore index dbd306c..ae251e9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ -## Build generated -build/ -DerivedData/ +# OS X +.DS_Store -## Various settings +# Xcode +build/ *.pbxuser !default.pbxuser *.mode1v3 @@ -12,53 +12,44 @@ DerivedData/ *.perspectivev3 !default.perspectivev3 xcuserdata/ - -## Other -*.moved-aside *.xccheckout -*.xcscmblueprint - -## Obj-C/Swift specific +profile +*.moved-aside +DerivedData *.hmap *.ipa -*.dSYM.zip -*.dSYM - -## Playgrounds -timeline.xctimeline -playground.xcworkspace - -# Swift Package Manager -# -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -# Packages/ -# Package.pins -.build/ -# CocoaPods -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# -# Pods/ +# Bundler +.bundle -# Carthage -# # Add this line if you want to avoid checking in source code from Carthage dependencies. # Carthage/Checkouts Carthage/Build -# fastlane +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control +# +# Note: if you ignore the Pods directory, make sure to uncomment +# `pod install` in .travis.yml # -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/#source-control +# Pods/ -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output -Pods +.build +DerivedData +/.previous-build +xcuserdata +.DS_Store +*~ +\#* +.\#* +.*.sw[nop] +*.xcscmblueprint +/default.profraw +*.xcodeproj +Utilities/Docker/*.tar.gz +.swiftpm +Package.resolved +/build +*.pyc diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 088216c..6087ebe 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -413,7 +413,7 @@ 13D43156C2811562198271DD1F3F32D6 /* UIButton+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+Rx.swift"; path = "RxCocoa/iOS/UIButton+Rx.swift"; sourceTree = ""; }; 14EE2C557CEEE7C8CC7CAB5B9FB0BD07 /* UINavigationController+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UINavigationController+Rx.swift"; path = "RxCocoa/iOS/UINavigationController+Rx.swift"; sourceTree = ""; }; 150550959A5E2126909D9CD099AC66BC /* NSSlider+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSSlider+Rx.swift"; path = "RxCocoa/macOS/NSSlider+Rx.swift"; sourceTree = ""; }; - 15DC18BE7B79A6011B0470691F827479 /* Pods_ServiceProvider_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ServiceProvider_Tests.framework; path = "Pods-ServiceProvider_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 15DC18BE7B79A6011B0470691F827479 /* Pods_ServiceProvider_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ServiceProvider_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 15F9A5199BC6927819E2EAF5331E1E08 /* UIControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIControl+Rx.swift"; path = "RxCocoa/iOS/UIControl+Rx.swift"; sourceTree = ""; }; 1696501EC67F2E1CBCBFE41B25D34BB2 /* _RXObjCRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXObjCRuntime.h; path = RxCocoa/Runtime/include/_RXObjCRuntime.h; sourceTree = ""; }; 17E98C2787B625F0C62958FBCE0BD2C1 /* DelaySubscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelaySubscription.swift; path = RxSwift/Observables/DelaySubscription.swift; sourceTree = ""; }; @@ -436,12 +436,12 @@ 249CD93174B76096B44663AF273C0B67 /* Lock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Lock.swift; path = RxSwift/Concurrency/Lock.swift; sourceTree = ""; }; 25768B2A7FF628E69629411FDF247C80 /* Bag+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Bag+Rx.swift"; path = "RxSwift/Extensions/Bag+Rx.swift"; sourceTree = ""; }; 26361D1E7B02B7CD89C2C324A6141F09 /* _RX.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RX.m; path = RxCocoa/Runtime/_RX.m; sourceTree = ""; }; - 269CBD012E5D1DD0FF572DCDF1A8C6E3 /* ServiceReload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServiceReload.swift; path = ServiceProvider/Classes/ServiceReload.swift; sourceTree = ""; }; + 269CBD012E5D1DD0FF572DCDF1A8C6E3 /* ServiceReload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServiceReload.swift; path = Sources/ServiceProvider/Classes/ServiceReload.swift; sourceTree = ""; }; 281F5B4B0C0961CAF97D9356118A324B /* Timer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timer.swift; path = RxSwift/Observables/Timer.swift; sourceTree = ""; }; 2995231F6036CAC57891F52AF48D6FD0 /* UITableView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITableView+Rx.swift"; path = "RxCocoa/iOS/UITableView+Rx.swift"; sourceTree = ""; }; 29D8ACF9034C4FC20442CD4F1DFA8428 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = ""; }; 2A1A6641926F39EB66055E2F1E72B718 /* ShareReplayScope.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplayScope.swift; path = RxSwift/Observables/ShareReplayScope.swift; sourceTree = ""; }; - 2A3905ABB198DBB6640697A1969547CC /* ServiceProvider.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ServiceProvider.framework; path = ServiceProvider.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2A3905ABB198DBB6640697A1969547CC /* ServiceProvider.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ServiceProvider.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2AB06640A31929DC2ED62DC33D8CED16 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = RxSwift/Errors.swift; sourceTree = ""; }; 2AFB40765C9CE4D99E4B6DE3A243055B /* AnonymousObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObserver.swift; path = RxSwift/Observers/AnonymousObserver.swift; sourceTree = ""; }; 2B6CA7806695BA46C205141827F44F47 /* RxTabBarDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTabBarDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift; sourceTree = ""; }; @@ -518,7 +518,7 @@ 6B4D4E074DB0327973DD374828CFB0DB /* KeychainAccess.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = KeychainAccess.modulemap; sourceTree = ""; }; 6BD9F8363FA4EB87058F04CFC144351D /* UIDatePicker+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIDatePicker+Rx.swift"; path = "RxCocoa/iOS/UIDatePicker+Rx.swift"; sourceTree = ""; }; 6BEAACC0E25D12817574669D2011D025 /* AnyObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyObserver.swift; path = RxSwift/AnyObserver.swift; sourceTree = ""; }; - 6C6FF4FB7B12855653E8429F7F4A43AB /* Service.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Service.swift; path = ServiceProvider/Classes/Service.swift; sourceTree = ""; }; + 6C6FF4FB7B12855653E8429F7F4A43AB /* Service.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Service.swift; path = Sources/ServiceProvider/Classes/Service.swift; sourceTree = ""; }; 6D84B7D1E0EB0259A14A81682269AEF5 /* ObserverBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverBase.swift; path = RxSwift/Observers/ObserverBase.swift; sourceTree = ""; }; 6F16C8BDF788CAC0F23475E65ACB03D8 /* RxSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-umbrella.h"; sourceTree = ""; }; 7001729AFEAAC9AB36F653D06AFCE462 /* UINavigationItem+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UINavigationItem+Rx.swift"; path = "RxCocoa/iOS/UINavigationItem+Rx.swift"; sourceTree = ""; }; @@ -543,7 +543,7 @@ 7E4AAC7BCCAC19A1473EEE492AB3E24F /* RxTabBarControllerDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTabBarControllerDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTabBarControllerDelegateProxy.swift; sourceTree = ""; }; 7F2137B211A00DC00E6CA4AC7B3234DE /* Reduce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reduce.swift; path = RxSwift/Observables/Reduce.swift; sourceTree = ""; }; 7FF76D647988585CCCC04A13DE8EA18C /* UIPageControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIPageControl+Rx.swift"; path = "RxCocoa/iOS/UIPageControl+Rx.swift"; sourceTree = ""; }; - 809C5FAB588354C9BA37DC3EAB8CB45C /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = RxSwift.framework; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 809C5FAB588354C9BA37DC3EAB8CB45C /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 80FE33737D9238DC81CA9C3C547ABD57 /* Timeout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeout.swift; path = RxSwift/Observables/Timeout.swift; sourceTree = ""; }; 813CC6733B65E36ECAF37CFD75464FBF /* RxCocoa.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxCocoa.xcconfig; sourceTree = ""; }; 81A0BA3F829578F83A6AA2E3FB424949 /* UISwitch+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UISwitch+Rx.swift"; path = "RxCocoa/iOS/UISwitch+Rx.swift"; sourceTree = ""; }; @@ -551,7 +551,7 @@ 82CC2F7CFC167D883BCDD5E3E928EA37 /* Buffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Buffer.swift; path = RxSwift/Observables/Buffer.swift; sourceTree = ""; }; 83DF7CEADD823DF7DF0270903A4B10F4 /* NSControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSControl+Rx.swift"; path = "RxCocoa/macOS/NSControl+Rx.swift"; sourceTree = ""; }; 84F748B8822231F31025E283481AB9CE /* Pods-ServiceProvider_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ServiceProvider_Tests-Info.plist"; sourceTree = ""; }; - 87D96E10B82BD21A62C84395BA8506E6 /* ServiceKeychain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServiceKeychain.swift; path = ServiceProvider/Classes/ServiceKeychain.swift; sourceTree = ""; }; + 87D96E10B82BD21A62C84395BA8506E6 /* ServiceKeychain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServiceKeychain.swift; path = Sources/ServiceProvider/Classes/ServiceKeychain.swift; sourceTree = ""; }; 885216827B48C35280D12F0B02CB0047 /* PrimitiveSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PrimitiveSequence.swift; path = RxSwift/Traits/PrimitiveSequence.swift; sourceTree = ""; }; 8C372FB605D8C2F7B100CCB197102EB9 /* RxSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "RxSwift-Info.plist"; sourceTree = ""; }; 8CF474136E1B0E63F88F8D0060A76076 /* Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecated.swift; path = RxSwift/Deprecated.swift; sourceTree = ""; }; @@ -559,7 +559,7 @@ 8DDDF172D36A623453A2C4F643C4CA85 /* ConnectableObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservableType.swift; path = RxSwift/ConnectableObservableType.swift; sourceTree = ""; }; 91A8BA606590A0224E343FA594A8D07B /* RxCollectionViewReactiveArrayDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewReactiveArrayDataSource.swift; path = RxCocoa/iOS/DataSources/RxCollectionViewReactiveArrayDataSource.swift; sourceTree = ""; }; 91B8DB8EC1C8CA12ED1CC02DAF4F5608 /* SynchronizedDisposeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedDisposeType.swift; path = RxSwift/Concurrency/SynchronizedDisposeType.swift; sourceTree = ""; }; - 91C96F157B73957823D045924DBEDDB9 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + 91C96F157B73957823D045924DBEDDB9 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 9237BEB7EF5BF3CABB02B7D291208889 /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = ""; }; 926933DB4FA37BD2AD6436448847794C /* UISegmentedControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UISegmentedControl+Rx.swift"; path = "RxCocoa/iOS/UISegmentedControl+Rx.swift"; sourceTree = ""; }; 93DFFA38488164FBA8713E6289F9F8CD /* Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Driver.swift; path = RxCocoa/Traits/Driver/Driver.swift; sourceTree = ""; }; @@ -581,7 +581,7 @@ 9C0F994707691DC526658FFFECF8F215 /* KeychainAccess.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KeychainAccess.xcconfig; sourceTree = ""; }; 9C96EDC17EDDFD3B3D28514BCC918EBB /* UISlider+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UISlider+Rx.swift"; path = "RxCocoa/iOS/UISlider+Rx.swift"; sourceTree = ""; }; 9D935BCF566A27DF6F3BC75283A05986 /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = ""; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 9DAF9B9D48230B4F8D8B2911259780A1 /* CurrentThreadScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CurrentThreadScheduler.swift; path = RxSwift/Schedulers/CurrentThreadScheduler.swift; sourceTree = ""; }; 9E3339155D3E908FB69CD08D0A1D45EA /* ScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItem.swift; path = RxSwift/Schedulers/Internal/ScheduledItem.swift; sourceTree = ""; }; 9FB4DA9C1033846631D6EA8C20F8E3CB /* Pods-ServiceProvider_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ServiceProvider_Example.debug.xcconfig"; sourceTree = ""; }; @@ -591,7 +591,7 @@ A1CCF680D80A18C9FBC14ECB1A208E31 /* RecursiveLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveLock.swift; path = Platform/RecursiveLock.swift; sourceTree = ""; }; A3E9977D1F226D92DCEB96895C9F5411 /* ControlTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlTarget.swift; path = RxCocoa/Common/ControlTarget.swift; sourceTree = ""; }; A403AC22739BDE732D2E06032F8DA583 /* NSObject+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx.swift"; path = "RxCocoa/Foundation/NSObject+Rx.swift"; sourceTree = ""; }; - A43C31F892964E27E1858FE052928248 /* Pods_ServiceProvider_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ServiceProvider_Example.framework; path = "Pods-ServiceProvider_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + A43C31F892964E27E1858FE052928248 /* Pods_ServiceProvider_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ServiceProvider_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A4C4DF680381897292DABD654BF49647 /* RxTableViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTableViewDelegateProxy.swift; sourceTree = ""; }; A5B02BC60954D2605E34171AABEB52A2 /* Do.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Do.swift; path = RxSwift/Observables/Do.swift; sourceTree = ""; }; A5E60671C30540069EB60DCFA00DF751 /* BehaviorSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorSubject.swift; path = RxSwift/Subjects/BehaviorSubject.swift; sourceTree = ""; }; @@ -632,7 +632,7 @@ BB3117484295787DAE559D44AF820238 /* RxTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTarget.swift; path = RxCocoa/Common/RxTarget.swift; sourceTree = ""; }; BBC14862603A92B36AC02A624CB9AFC6 /* Skip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Skip.swift; path = RxSwift/Observables/Skip.swift; sourceTree = ""; }; BC04D44FFB172C7A133FC94B8D8F9756 /* RxCocoa.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCocoa.swift; path = RxCocoa/RxCocoa.swift; sourceTree = ""; }; - BC432FD48A5932251F1CAFBC4BF74894 /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = RxCocoa.framework; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BC432FD48A5932251F1CAFBC4BF74894 /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BC50B58F92423DE97C26E413DBDD0CB2 /* UIGestureRecognizer+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIGestureRecognizer+Rx.swift"; path = "RxCocoa/iOS/UIGestureRecognizer+Rx.swift"; sourceTree = ""; }; BC5C186AD1A4B1D7296CCD8A42905884 /* KeyPathBinder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KeyPathBinder.swift; path = RxCocoa/Common/KeyPathBinder.swift; sourceTree = ""; }; BD2E561CE65841A512B0364110375EA4 /* Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debug.swift; path = RxSwift/Observables/Debug.swift; sourceTree = ""; }; @@ -655,7 +655,7 @@ CB4D89AA7E6FC92C04CE0AC885A6F0B2 /* Reactive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reactive.swift; path = RxSwift/Reactive.swift; sourceTree = ""; }; CBCC5B4B505202023D8F1BC0292BA3CD /* SynchronizedOnType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedOnType.swift; path = RxSwift/Concurrency/SynchronizedOnType.swift; sourceTree = ""; }; CCDFF87F84C8EE9C7B375F626F922B0F /* DefaultIfEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultIfEmpty.swift; path = RxSwift/Observables/DefaultIfEmpty.swift; sourceTree = ""; }; - CD21180F1DE02C3D5E7A14339567AB4C /* ServiceNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServiceNotification.swift; path = ServiceProvider/Classes/ServiceNotification.swift; sourceTree = ""; }; + CD21180F1DE02C3D5E7A14339567AB4C /* ServiceNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServiceNotification.swift; path = Sources/ServiceProvider/Classes/ServiceNotification.swift; sourceTree = ""; }; CD4A5DBB72FA693933E5787CD09B7716 /* Generate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generate.swift; path = RxSwift/Observables/Generate.swift; sourceTree = ""; }; CD5DAAC0A425AAE07DA2FDC79188C1E2 /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = RxSwift/Observable.swift; sourceTree = ""; }; CDC69B6FEB02B66B35C31C99282A705E /* SingleAsync.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAsync.swift; path = RxSwift/Observables/SingleAsync.swift; sourceTree = ""; }; @@ -663,7 +663,7 @@ CF70C3430AA050D09D4E3A43046F85AA /* Take.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Take.swift; path = RxSwift/Observables/Take.swift; sourceTree = ""; }; D0931FD12122E01F0C3D761FFD62DF71 /* Delay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Delay.swift; path = RxSwift/Observables/Delay.swift; sourceTree = ""; }; D0BD833401EE045B84BF7E51D9608076 /* NopDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NopDisposable.swift; path = RxSwift/Disposables/NopDisposable.swift; sourceTree = ""; }; - D19CFD045196453AC807B0B27C2B6AB0 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + D19CFD045196453AC807B0B27C2B6AB0 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; D241C443A18B3894A8A5BF3E6E84FE25 /* RxSearchBarDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxSearchBarDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift; sourceTree = ""; }; D26F4F3C366B3D158148C8087EC40B37 /* Pods-ServiceProvider_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ServiceProvider_Example-acknowledgements.markdown"; sourceTree = ""; }; D2992DB62B78241D53FC1594EA00CC57 /* Never.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Never.swift; path = RxSwift/Observables/Never.swift; sourceTree = ""; }; @@ -674,7 +674,7 @@ D5D52ECBB63678C1EB50B47664DCC8CF /* SkipUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipUntil.swift; path = RxSwift/Observables/SkipUntil.swift; sourceTree = ""; }; D8A5A75C20111C3D814342244835AF52 /* String+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Rx.swift"; path = "RxSwift/Extensions/String+Rx.swift"; sourceTree = ""; }; DAE55E7FF899318658DF36331B3FB4E0 /* Pods-ServiceProvider_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ServiceProvider_Tests.modulemap"; sourceTree = ""; }; - DB61A5769AE66DFDF1A384127A1F3AC1 /* ServiceStored.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServiceStored.swift; path = ServiceProvider/Classes/ServiceStored.swift; sourceTree = ""; }; + DB61A5769AE66DFDF1A384127A1F3AC1 /* ServiceStored.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServiceStored.swift; path = Sources/ServiceProvider/Classes/ServiceStored.swift; sourceTree = ""; }; DBF69FD9D4DBCA3DAB9F5198F532895C /* Debounce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debounce.swift; path = RxSwift/Observables/Debounce.swift; sourceTree = ""; }; DD7B97F842A2F7CA38242C8E024B136A /* Signal+Subscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Signal+Subscription.swift"; path = "RxCocoa/Traits/Signal/Signal+Subscription.swift"; sourceTree = ""; }; DE18AAF54FD56D0F87E53DCB16E11DBB /* RxTableViewDataSourceProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDataSourceProxy.swift; path = RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift; sourceTree = ""; }; @@ -688,13 +688,13 @@ E4545FA21988A9B13D68577E963EFA99 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = RxSwift/Observables/Error.swift; sourceTree = ""; }; E78CBB341532326FA2051F5A0352BD9D /* SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SharedSequence.swift; path = RxCocoa/Traits/SharedSequence/SharedSequence.swift; sourceTree = ""; }; E8788C326347355070815AD174C46973 /* KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KVORepresentable.swift; path = RxCocoa/Foundation/KVORepresentable.swift; sourceTree = ""; }; - E8EE7F078656FABB8F6821D10FF994BB /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = KeychainAccess.framework; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E8EE7F078656FABB8F6821D10FF994BB /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E967FC09FFE456859BA0A11BE8CFCAFE /* UIRefreshControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIRefreshControl+Rx.swift"; path = "RxCocoa/iOS/UIRefreshControl+Rx.swift"; sourceTree = ""; }; E9EA9EFCF1B9A669A62BE0F2BC831542 /* RxCocoa-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxCocoa-dummy.m"; sourceTree = ""; }; EA3C4AC6DEB0D2359D8FC5C08D475DB5 /* Logging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logging.swift; path = RxCocoa/Foundation/Logging.swift; sourceTree = ""; }; EADA49C6D6C18ED7910BED41C21ED0D5 /* Materialize.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Materialize.swift; path = RxSwift/Observables/Materialize.swift; sourceTree = ""; }; - EBE8A5C83E2E5519BEC530B9DB4EAE89 /* ServiceProvider.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = ServiceProvider.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - EC18A56C3056679B3951F9008C58A882 /* ServiceStoredRx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServiceStoredRx.swift; path = ServiceProvider/Classes/ServiceStoredRx.swift; sourceTree = ""; }; + EBE8A5C83E2E5519BEC530B9DB4EAE89 /* ServiceProvider.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = ServiceProvider.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + EC18A56C3056679B3951F9008C58A882 /* ServiceStoredRx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServiceStoredRx.swift; path = Sources/ServiceProvider/Classes/ServiceStoredRx.swift; sourceTree = ""; }; EE7B66A500BCE8088A06F9597BEA6661 /* SchedulerServices+Emulation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SchedulerServices+Emulation.swift"; path = "RxSwift/Schedulers/SchedulerServices+Emulation.swift"; sourceTree = ""; }; EE9E07A77B2FCA94BCA4753C27167B03 /* KVORepresentable+Swift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "KVORepresentable+Swift.swift"; path = "RxCocoa/Foundation/KVORepresentable+Swift.swift"; sourceTree = ""; }; EF74BB9451F37A386042297B380F8A2F /* ImmediateSchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateSchedulerType.swift; path = RxSwift/ImmediateSchedulerType.swift; sourceTree = ""; }; @@ -996,7 +996,6 @@ 3B2700BF54A72A71B50BB34C2C6EE8A1 /* URLSession+Rx.swift */, 8FD5D9821A6715FBB52527AC511CDE45 /* Support Files */, ); - name = RxCocoa; path = RxCocoa; sourceTree = ""; }; @@ -1155,7 +1154,6 @@ A913A5D52521CED966A2C1CF537FCA13 /* Zip+Collection.swift */, 7CC448DC4A209D018D5DF81F64147B71 /* Support Files */, ); - name = RxSwift; path = RxSwift; sourceTree = ""; }; @@ -1239,7 +1237,6 @@ 1103C8D3890809C344B729FB5031A97D /* Keychain.swift */, 4AF236A3034993B64EE1AA672FEFB64C /* Support Files */, ); - name = KeychainAccess; path = KeychainAccess; sourceTree = ""; }; @@ -2246,8 +2243,7 @@ MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 5.0; SYMROOT = "${SRCROOT}/../build"; }; diff --git a/Example/Pods/Pods.xcodeproj/xcuserdata/brennobemoura.xcuserdatad/xcschemes/xcschememanagement.plist b/Example/Pods/Pods.xcodeproj/xcuserdata/brennobemoura.xcuserdatad/xcschemes/xcschememanagement.plist index fd92ca7..a174658 100644 --- a/Example/Pods/Pods.xcodeproj/xcuserdata/brennobemoura.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Example/Pods/Pods.xcodeproj/xcuserdata/brennobemoura.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,30 +9,51 @@ isShown + KeychainAccess.xcscheme_^#shared#^_ + + orderHint + 4 + Pods-ServiceProvider_Example.xcscheme isShown + orderHint + 0 Pods-ServiceProvider_Tests.xcscheme isShown + orderHint + 1 RxCocoa.xcscheme isShown + RxCocoa.xcscheme_^#shared#^_ + + orderHint + 5 + RxSwift.xcscheme isShown + RxSwift.xcscheme_^#shared#^_ + + orderHint + 6 + ServiceProvider.xcscheme isShown + orderHint + 2 SuppressBuildableAutocreation diff --git a/Example/ServiceProvider.xcodeproj/project.pbxproj b/Example/ServiceProvider.xcodeproj/project.pbxproj index edf26d8..42ed8c5 100644 --- a/Example/ServiceProvider.xcodeproj/project.pbxproj +++ b/Example/ServiceProvider.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 0C36D52B2440C1770062752A /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C36D52A2440C1770062752A /* Package.swift */; }; 4F37D739747FB018A5E2AA96 /* Pods_ServiceProvider_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C286321D1657E7011C8B5C9 /* Pods_ServiceProvider_Tests.framework */; }; 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; @@ -28,6 +29,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 0C36D52A2440C1770062752A /* Package.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Package.swift; path = ../Package.swift; sourceTree = ""; }; 1949C23199C656A3E6509960 /* Pods-ServiceProvider_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ServiceProvider_Tests.release.xcconfig"; path = "Target Support Files/Pods-ServiceProvider_Tests/Pods-ServiceProvider_Tests.release.xcconfig"; sourceTree = ""; }; 1C2546DF388A74D95578F42A /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 4C286321D1657E7011C8B5C9 /* Pods_ServiceProvider_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ServiceProvider_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -72,6 +74,7 @@ 607FACC71AFB9204008FA782 = { isa = PBXGroup; children = ( + 0C36D52A2440C1770062752A /* Package.swift */, 607FACF51AFB993E008FA782 /* Podspec Metadata */, 607FACD21AFB9204008FA782 /* Example for ServiceProvider */, 607FACE81AFB9204008FA782 /* Tests */, @@ -337,6 +340,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 0C36D52B2440C1770062752A /* Package.swift in Sources */, 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, ); diff --git a/Example/ServiceProvider.xcworkspace/xcuserdata/brennobemoura.xcuserdatad/UserInterfaceState.xcuserstate b/Example/ServiceProvider.xcworkspace/xcuserdata/brennobemoura.xcuserdatad/UserInterfaceState.xcuserstate index c54d17ae034288611ca32698384828e8322bb378..2b66109517de60dd5d6dc8ddeba3be1ceb3f220f 100644 GIT binary patch delta 19543 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 delta 15479 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 xt-V`^w-zL~Ru>9-{{s{&eTx79 diff --git a/LICENSE b/LICENSE index a08a425..fea4d29 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2019 brennobemoura +Copyright (c) 2019-Present Umobi - https:github.com/umobi Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..8f02ed2 --- /dev/null +++ b/Package.swift @@ -0,0 +1,29 @@ +// swift-tools-version:5.2 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "ServiceProvider", + products: [ + // Products define the executables and libraries produced by a package, and make them visible to other packages. + .library( + name: "ServiceProvider", + targets: ["ServiceProvider"]), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + .package(url: "https://github.com/kishikawakatsumi/KeychainAccess", "3.2"..<"4.1.0"), + .package(url: "https://github.com/ReactiveX/RxSwift", from: "5.0.0"), + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages which this package depends on. + .target( + name: "ServiceProvider", + dependencies: ["RxSwift", "RxCocoa", "KeychainAccess"]), + .testTarget( + name: "ServiceProviderTests", + dependencies: ["ServiceProvider"]), + ] +) diff --git a/ServiceProvider.podspec b/ServiceProvider.podspec index d155bbb..0738590 100644 --- a/ServiceProvider.podspec +++ b/ServiceProvider.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.name = 'ServiceProvider' - s.version = '1.1.1' + s.version = '1.1.2' s.summary = 'ServiceProvider keeps your data near from our code' # This description is used to generate tags and improve search results. @@ -34,7 +34,7 @@ DESC s.source_files = 'ServiceProvider/Classes/**/*' - s.dependency 'RxSwift', '>= 4.5', "<= 5.0" - s.dependency 'RxCocoa', '>= 4.5', "<= 5.0" + s.dependency 'RxSwift', '5.0" + s.dependency 'RxCocoa', '5.0" s.dependency 'KeychainAccess', ">= 3.2", '<= 4.1.0' end diff --git a/ServiceProvider/Classes/ServiceKeychain.swift b/ServiceProvider/Classes/ServiceKeychain.swift deleted file mode 100644 index a3d9ffb..0000000 --- a/ServiceProvider/Classes/ServiceKeychain.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// ServiceKeychain.swift -// mercadoon -// -// Created by brennobemoura on 21/08/19. -// Copyright © 2019 brennobemoura. All rights reserved. -// - -import Foundation -import KeychainAccess - -public protocol KeychainKey: RawRepresentable { - var rawValue: String { get } -} - -public protocol ServiceKeychain { - associatedtype KeychainKeys: KeychainKey - - var keychain: Keychain { get } -} - -public extension ServiceKeychain { - func set(_ value: String, for key: KeychainKeys) throws { - try self.keychain.set(value, key: key.rawValue) - } - - func set(_ value: Data, for key: KeychainKeys) throws { - try self.keychain.set(value, key: key.rawValue) - } - - func get(for key: KeychainKeys) throws -> String? { - return try self.keychain.getString(key.rawValue) - } - - func get(for key: KeychainKeys) throws -> Data? { - return try self.keychain.getData(key.rawValue) - } - - func remove(for key: KeychainKeys) throws { - try self.keychain.remove(key.rawValue) - } -} - -public extension Keychain { - static var main: Keychain { - return .init(service: Bundle.main.bundleIdentifier!) - } -} - -public extension ServiceKeychain { - var keychain: Keychain { - return .main - } -} diff --git a/ServiceProvider/Classes/ServiceNotification.swift b/ServiceProvider/Classes/ServiceNotification.swift deleted file mode 100644 index 629c677..0000000 --- a/ServiceProvider/Classes/ServiceNotification.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// ServiceNotification.swift -// mercadoon -// -// Created by brennobemoura on 21/08/19. -// Copyright © 2019 brennobemoura. All rights reserved. -// - -import Foundation - -public protocol NotificationKey: RawRepresentable where RawValue == String {} - -public protocol ServiceNotification: class { - associatedtype NotificationKeys: NotificationKey -} - -public extension NotificationKey { - func name(_ serviceNotification: Service) -> Notification.Name { - return Notification.Name("\(ObjectIdentifier(serviceNotification))" + "." + self.rawValue) - } -} - -public extension ServiceNotification { - func post(object: Any? = nil, for key: NotificationKeys) { - NotificationCenter.default.post(name: key.name(self), object: nil) - } -} - -public extension Service where Controller: ServiceNotification { - func notification(_ key: Controller.NotificationKeys) -> Notification.Name? { - return key.name(self.controller) - } -} diff --git a/ServiceProvider/Classes/ServiceReload.swift b/ServiceProvider/Classes/ServiceReload.swift deleted file mode 100644 index 2efb1ed..0000000 --- a/ServiceProvider/Classes/ServiceReload.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// ServiceReload.swift -// mercadoon -// -// Created by brennobemoura on 21/08/19. -// Copyright © 2019 brennobemoura. All rights reserved. -// - -import Foundation -import RxCocoa -import RxSwift - -open class ReloadService: Service { - open func reload(_ completionHandler: (() -> Void)? = nil) { - self.controller.reload(completionHandler) - } -} - -open class ReloadController: ServiceController { - public final let disposeBag = DisposeBag() - - open func reload(_ completionHandler: (() -> Void)? = nil) { - completionHandler?() - } - - public required init() { - NotificationCenter.default.rx - .notification(NotificationKeys.reloadInfo.name(self)) - .asDriver(onErrorDriveWith: .never()) - .drive(onNext: { [weak self] _ in - self?.reload() - }).disposed(by: disposeBag) - - DispatchQueue.global().asyncAfter(deadline: .now() + 1.0, execute: { - self.post(for: .reloadInfo) - }) - } -} - -extension ReloadController: ServiceNotification { - public enum NotificationKeys: String, NotificationKey { - case reloadInfo - } -} diff --git a/ServiceProvider/Assets/.gitkeep b/Sources/ServiceProvider/Assets/.gitkeep similarity index 100% rename from ServiceProvider/Assets/.gitkeep rename to Sources/ServiceProvider/Assets/.gitkeep diff --git a/ServiceProvider/Classes/.gitkeep b/Sources/ServiceProvider/Classes/.gitkeep similarity index 100% rename from ServiceProvider/Classes/.gitkeep rename to Sources/ServiceProvider/Classes/.gitkeep diff --git a/ServiceProvider/Classes/Service.swift b/Sources/ServiceProvider/Classes/Service.swift similarity index 65% rename from ServiceProvider/Classes/Service.swift rename to Sources/ServiceProvider/Classes/Service.swift index 4eb9606..8d38b88 100644 --- a/ServiceProvider/Classes/Service.swift +++ b/Sources/ServiceProvider/Classes/Service.swift @@ -1,9 +1,23 @@ // -// Service.swift -// mercadoon +// Copyright (c) 2019-Present Umobi - https://github.com/umobi // -// Created by brennobemoura on 13/08/19. -// Copyright © 2019 brennobemoura. All rights reserved. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // import Foundation diff --git a/Sources/ServiceProvider/Classes/ServiceKeychain.swift b/Sources/ServiceProvider/Classes/ServiceKeychain.swift new file mode 100644 index 0000000..7f7c2db --- /dev/null +++ b/Sources/ServiceProvider/Classes/ServiceKeychain.swift @@ -0,0 +1,68 @@ +// +// Copyright (c) 2019-Present Umobi - https://github.com/umobi +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation +import KeychainAccess + +public protocol KeychainKey: RawRepresentable { + var rawValue: String { get } +} + +public protocol ServiceKeychain { + associatedtype KeychainKeys: KeychainKey + + var keychain: Keychain { get } +} + +public extension ServiceKeychain { + func set(_ value: String, for key: KeychainKeys) throws { + try self.keychain.set(value, key: key.rawValue) + } + + func set(_ value: Data, for key: KeychainKeys) throws { + try self.keychain.set(value, key: key.rawValue) + } + + func get(for key: KeychainKeys) throws -> String? { + return try self.keychain.getString(key.rawValue) + } + + func get(for key: KeychainKeys) throws -> Data? { + return try self.keychain.getData(key.rawValue) + } + + func remove(for key: KeychainKeys) throws { + try self.keychain.remove(key.rawValue) + } +} + +public extension Keychain { + static var main: Keychain { + return .init(service: Bundle.main.bundleIdentifier!) + } +} + +public extension ServiceKeychain { + var keychain: Keychain { + return .main + } +} diff --git a/Sources/ServiceProvider/Classes/ServiceNotification.swift b/Sources/ServiceProvider/Classes/ServiceNotification.swift new file mode 100644 index 0000000..5e4940d --- /dev/null +++ b/Sources/ServiceProvider/Classes/ServiceNotification.swift @@ -0,0 +1,47 @@ +// +// Copyright (c) 2019-Present Umobi - https://github.com/umobi +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +public protocol NotificationKey: RawRepresentable where RawValue == String {} + +public protocol ServiceNotification: class { + associatedtype NotificationKeys: NotificationKey +} + +public extension NotificationKey { + func name(_ serviceNotification: Service) -> Notification.Name { + return Notification.Name("\(ObjectIdentifier(serviceNotification))" + "." + self.rawValue) + } +} + +public extension ServiceNotification { + func post(object: Any? = nil, for key: NotificationKeys) { + NotificationCenter.default.post(name: key.name(self), object: nil) + } +} + +public extension Service where Controller: ServiceNotification { + func notification(_ key: Controller.NotificationKeys) -> Notification.Name? { + return key.name(self.controller) + } +} diff --git a/Sources/ServiceProvider/Classes/ServiceReload.swift b/Sources/ServiceProvider/Classes/ServiceReload.swift new file mode 100644 index 0000000..420a141 --- /dev/null +++ b/Sources/ServiceProvider/Classes/ServiceReload.swift @@ -0,0 +1,58 @@ +// +// Copyright (c) 2019-Present Umobi - https://github.com/umobi +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation +import RxCocoa +import RxSwift + +open class ReloadService: Service { + open func reload(_ completionHandler: (() -> Void)? = nil) { + self.controller.reload(completionHandler) + } +} + +open class ReloadController: ServiceController { + public final let disposeBag = DisposeBag() + + open func reload(_ completionHandler: (() -> Void)? = nil) { + completionHandler?() + } + + public required init() { + NotificationCenter.default.rx + .notification(NotificationKeys.reloadInfo.name(self)) + .asDriver(onErrorDriveWith: .never()) + .drive(onNext: { [weak self] _ in + self?.reload() + }).disposed(by: disposeBag) + + DispatchQueue.global().asyncAfter(deadline: .now() + 1.0, execute: { + self.post(for: .reloadInfo) + }) + } +} + +extension ReloadController: ServiceNotification { + public enum NotificationKeys: String, NotificationKey { + case reloadInfo + } +} diff --git a/ServiceProvider/Classes/ServiceStored.swift b/Sources/ServiceProvider/Classes/ServiceStored.swift similarity index 54% rename from ServiceProvider/Classes/ServiceStored.swift rename to Sources/ServiceProvider/Classes/ServiceStored.swift index 597056f..099482c 100644 --- a/ServiceProvider/Classes/ServiceStored.swift +++ b/Sources/ServiceProvider/Classes/ServiceStored.swift @@ -1,9 +1,23 @@ // -// BaseService.swift -// TokBeauty +// Copyright (c) 2019-Present Umobi - https://github.com/umobi // -// Created by Ramon Vicente on 14/03/17. -// Copyright © 2017 TokBeauty. All rights reserved. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // import Foundation diff --git a/ServiceProvider/Classes/ServiceStoredRx.swift b/Sources/ServiceProvider/Classes/ServiceStoredRx.swift similarity index 73% rename from ServiceProvider/Classes/ServiceStoredRx.swift rename to Sources/ServiceProvider/Classes/ServiceStoredRx.swift index d6c30fd..92533d6 100644 --- a/ServiceProvider/Classes/ServiceStoredRx.swift +++ b/Sources/ServiceProvider/Classes/ServiceStoredRx.swift @@ -1,9 +1,23 @@ // -// ServiceStoredRx.swift -// mercadoon +// Copyright (c) 2019-Present Umobi - https://github.com/umobi // -// Created by brennobemoura on 21/08/19. -// Copyright © 2019 brennobemoura. All rights reserved. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // import Foundation diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift new file mode 100644 index 0000000..751019a --- /dev/null +++ b/Tests/LinuxMain.swift @@ -0,0 +1,7 @@ +import XCTest + +import ServiceProviderTests + +var tests = [XCTestCaseEntry]() +tests += ServiceProviderTests.allTests() +XCTMain(tests) diff --git a/Tests/ServiceProviderTests/ServiceProviderTests.swift b/Tests/ServiceProviderTests/ServiceProviderTests.swift new file mode 100644 index 0000000..460b4c0 --- /dev/null +++ b/Tests/ServiceProviderTests/ServiceProviderTests.swift @@ -0,0 +1,15 @@ +import XCTest +@testable import ServiceProvider + +final class ServiceProviderTests: XCTestCase { + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct + // results. + XCTAssertEqual(ServiceProvider().text, "Hello, World!") + } + + static var allTests = [ + ("testExample", testExample), + ] +} diff --git a/Tests/ServiceProviderTests/XCTestManifests.swift b/Tests/ServiceProviderTests/XCTestManifests.swift new file mode 100644 index 0000000..7d60657 --- /dev/null +++ b/Tests/ServiceProviderTests/XCTestManifests.swift @@ -0,0 +1,9 @@ +import XCTest + +#if !canImport(ObjectiveC) +public func allTests() -> [XCTestCaseEntry] { + return [ + testCase(ServiceProviderTests.allTests), + ] +} +#endif