diff --git a/.travis.yml b/.travis.yml index 97082d1a..7950b92d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,17 +46,17 @@ matrix: - TVOS_SDK=appletvsimulator12.2 - WATCHOS_SIMULATOR='name=Apple Watch Series 4 - 44mm' - WATCHOS_SDK=watchsimulator5.2 - # - os: linux - # sudo: required - # dist: trusty - # name: Swift 5.0 compatibility - # env: - # - CACHE_NAME=LINUX_SWIFT5_0 - # - SWIFT_VERSION=5.0-dev - # before_install: - # - eval "$(curl -sL https://swiftenv.fuller.li/install.sh)" - # script: - # - swift test + - os: linux + sudo: required + dist: trusty + name: Swift 5.1 compatibility + env: + - CACHE_NAME=LINUX_SWIFT5_1 + - SWIFT_VERSION=5.1 + before_install: + - eval "$(curl -sL https://swiftenv.fuller.li/install.sh)" + script: + - TEST=1 swift test - os: osx osx_image: xcode10.1 name: Swift 4.2 compatibility @@ -71,17 +71,17 @@ matrix: - TVOS_SDK=appletvsimulator12.1 - WATCHOS_SIMULATOR='name=Apple Watch - 42mm' - WATCHOS_SDK=watchsimulator5.1 - # - os: linux - # sudo: required - # dist: trusty - # name: Swift 4.2 compatibility - # env: - # - CACHE_NAME=LINUX_SWIFT4_2 - # - SWIFT_VERSION=4.2 - # before_install: - # - eval "$(curl -sL https://swiftenv.fuller.li/install.sh)" - # script: - # - swift test + - os: linux + sudo: required + dist: trusty + name: Swift 4.2 compatibility + env: + - CACHE_NAME=LINUX_SWIFT4_2 + - SWIFT_VERSION=4.2 + before_install: + - eval "$(curl -sL https://swiftenv.fuller.li/install.sh)" + script: + - TEST=1 swift test - os: osx osx_image: xcode10.1 name: Swift 4.1 compatibility diff --git a/CHANGELOG.md b/CHANGELOG.md index 74ac6eec..31c67df5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ ### Next +* Added Swift for Linux support ### 5.1.0 (2020-12-14) * Increase min deployment target to iOS 9.0 due to Xcode 12 requirements [@laevandus](https://github.com/laevandus) diff --git a/README.md b/README.md index 884e9ba3..38ad2939 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # SwiftyUserDefaults [![Stake to support us](https://badge.devprotocol.xyz/0x5C7db549a025586DEc6667b3c0217e2e97f19033/descriptive)](https://stakes.social/0x5C7db549a025586DEc6667b3c0217e2e97f19033) -![Platforms](https://img.shields.io/badge/platforms-ios%20%7C%20osx%20%7C%20watchos%20%7C%20tvos-lightgrey.svg) +![Platforms](https://img.shields.io/badge/platforms-ios%20%7C%20osx%20%7C%20watchos%20%7C%20tvos%20%7C%20linux-lightgrey.svg) [![CI Status](https://api.travis-ci.org/sunshinejr/SwiftyUserDefaults.svg?branch=master)](https://travis-ci.org/sunshinejr/SwiftyUserDefaults) [![CocoaPods compatible](https://img.shields.io/badge/CocoaPods-compatible-4BC51D.svg?style=flat)](#cocoapods) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](#carthage) diff --git a/Sources/BuiltIns.swift b/Sources/BuiltIns.swift index 8a727265..623da93a 100644 --- a/Sources/BuiltIns.swift +++ b/Sources/BuiltIns.swift @@ -47,7 +47,7 @@ extension Data: DefaultsSerializable { } extension URL: DefaultsSerializable { - #if os(Linux) + #if !canImport(Darwin) public static var _defaults: DefaultsKeyedArchiverBridge { return DefaultsKeyedArchiverBridge() } #else public static var _defaults: DefaultsUrlBridge { return DefaultsUrlBridge() } diff --git a/Sources/Defaults+Observing.swift b/Sources/Defaults+Observing.swift index ab7349bb..d77bc334 100644 --- a/Sources/Defaults+Observing.swift +++ b/Sources/Defaults+Observing.swift @@ -24,7 +24,7 @@ import Foundation -#if !os(Linux) +#if canImport(Darwin) public extension DefaultsAdapter { diff --git a/Sources/DefaultsObserver.swift b/Sources/DefaultsObserver.swift index 80a2d1e5..924e0c99 100644 --- a/Sources/DefaultsObserver.swift +++ b/Sources/DefaultsObserver.swift @@ -28,7 +28,7 @@ public protocol DefaultsDisposable { func dispose() } -#if !os(Linux) +#if canImport(Darwin) public final class DefaultsObserver: NSObject, DefaultsDisposable where T == T.T { diff --git a/Sources/PropertyWrappers.swift b/Sources/PropertyWrappers.swift index 585038f1..ce94ba1b 100644 --- a/Sources/PropertyWrappers.swift +++ b/Sources/PropertyWrappers.swift @@ -26,7 +26,9 @@ public struct SwiftyUserDefaultOptions: OptionSet { public static let cached = SwiftyUserDefaultOptions(rawValue: 1 << 0) + #if canImport(Darwin) public static let observed = SwiftyUserDefaultOptions(rawValue: 1 << 2) + #endif public let rawValue: Int @@ -62,22 +64,26 @@ public final class SwiftyUserDefault where T.T == T { self.key = adapter.keyStore[keyPath: keyPath] self.options = options + #if canImport(Darwin) if options.contains(.observed) { observation = adapter.observe(key) { [weak self] update in self?._value = update.newValue } } + #endif } public init(keyPath: KeyPath>, options: SwiftyUserDefaultOptions = []) { self.key = Defaults.keyStore[keyPath: keyPath] self.options = options + #if canImport(Darwin) if options.contains(.observed) { observation = Defaults.observe(key) { [weak self] update in self?._value = update.newValue } } + #endif } deinit { diff --git a/Tests/SwiftyUserDefaultsTests/TestHelpers/DefaultsSerializableSpec.swift b/Tests/SwiftyUserDefaultsTests/TestHelpers/DefaultsSerializableSpec.swift index b2248793..90fab73f 100644 --- a/Tests/SwiftyUserDefaultsTests/TestHelpers/DefaultsSerializableSpec.swift +++ b/Tests/SwiftyUserDefaultsTests/TestHelpers/DefaultsSerializableSpec.swift @@ -498,7 +498,7 @@ extension DefaultsSerializableSpec where Serializable.T: Equatable, Serializable } func testObserving() { - #if !os(Linux) + #if canImport(Darwin) given("key-value observing") { var defaults: DefaultsAdapter>! var observer: DefaultsDisposable?