From 5477ac1e0fb8440f1e34d235c17fb922da98644c Mon Sep 17 00:00:00 2001 From: Ghulam Nasir Date: Mon, 10 Aug 2020 10:35:12 +0200 Subject: [PATCH] first version of XServiceLocator --- .gitignore | 31 + .travis.yml | 6 + LICENSE | 21 + Package.swift | 22 + README.md | 255 ++++++++ Sources/XServiceLocator/Container.swift | 101 ++++ .../Extensions/Array+Resolver.swift | 25 + .../Collection+FirstToResolve.swift | 22 + Sources/XServiceLocator/Resolver.swift | 17 + .../ServiceFactory/AnyServiceFactory.swift | 31 + .../ServiceFactory/BasicServiceFactory.swift | 25 + .../ServiceFactory/ServiceFactory.swift | 23 + Tests/LinuxMain.swift | 7 + .../XServiceLocatorTests.swift | 190 ++++++ .../utils/DummyProtocol.swift | 11 + .../utils/TestClass.swift | 18 + .../utils/TestProtocol.swift | 12 + .../utils/TestStruct.swift | 12 + XServiceLocator.jpeg | Bin 0 -> 164032 bytes XServiceLocator.podspec | 14 + XServiceLocator.xcodeproj/Info.plist | 22 + XServiceLocator.xcodeproj/project.pbxproj | 566 ++++++++++++++++++ .../xcschemes/XServiceLocator.xcscheme | 77 +++ .../xcschemes/XServiceLocatorTests.xcscheme | 53 ++ XServiceLocator/Info.plist | 22 + XServiceLocator/XServiceLocator.h | 18 + 26 files changed, 1601 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 LICENSE create mode 100644 Package.swift create mode 100644 README.md create mode 100644 Sources/XServiceLocator/Container.swift create mode 100644 Sources/XServiceLocator/Extensions/Array+Resolver.swift create mode 100644 Sources/XServiceLocator/Extensions/Collection+FirstToResolve.swift create mode 100644 Sources/XServiceLocator/Resolver.swift create mode 100644 Sources/XServiceLocator/ServiceFactory/AnyServiceFactory.swift create mode 100644 Sources/XServiceLocator/ServiceFactory/BasicServiceFactory.swift create mode 100644 Sources/XServiceLocator/ServiceFactory/ServiceFactory.swift create mode 100644 Tests/LinuxMain.swift create mode 100644 Tests/XServiceLocatorTests/XServiceLocatorTests.swift create mode 100644 Tests/XServiceLocatorTests/utils/DummyProtocol.swift create mode 100644 Tests/XServiceLocatorTests/utils/TestClass.swift create mode 100644 Tests/XServiceLocatorTests/utils/TestProtocol.swift create mode 100644 Tests/XServiceLocatorTests/utils/TestStruct.swift create mode 100644 XServiceLocator.jpeg create mode 100644 XServiceLocator.podspec create mode 100644 XServiceLocator.xcodeproj/Info.plist create mode 100644 XServiceLocator.xcodeproj/project.pbxproj create mode 100644 XServiceLocator.xcodeproj/xcshareddata/xcschemes/XServiceLocator.xcscheme create mode 100644 XServiceLocator.xcodeproj/xcshareddata/xcschemes/XServiceLocatorTests.xcscheme create mode 100644 XServiceLocator/Info.plist create mode 100644 XServiceLocator/XServiceLocator.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1d316aa --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# Mac OS X +*.DS_Store + +# Xcode +.build +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 +*.xcuserstate +project.xcworkspace/ +xcuserdata/ +Pods/*.xcodeproj/xcuserdata/ +xcuserdata/ +/.build +/Packages + +# Generated files +*.o +*.pyc + +# Docs +docs/docsets/XCoordinator.tgz +docs/undocumented.json + +# Backup files +*~.nib +\#*# +.#* + +.swiftpm diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..0b43d04 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +language: swift +os: osx +osx_image: xcode10.1 +script: + - swift build + - swift test diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6fc0704 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 QuickBird Studios + +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. diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..3eec1be --- /dev/null +++ b/Package.swift @@ -0,0 +1,22 @@ +// swift-tools-version:4.0 +// The swift-tools-version declares the minimum version of Swift required to build this package. + + +import PackageDescription + +let package = Package( + name: "XServiceLocator", + products: [ + .library( + name: "XServiceLocator", + targets: ["XServiceLocator"]), + ], + targets: [ + .target( + name: "XServiceLocator", + dependencies: []), + .testTarget( + name: "XServiceLocatorTests", + dependencies: ["XServiceLocator"]), + ] +) diff --git a/README.md b/README.md new file mode 100644 index 0000000..f585063 --- /dev/null +++ b/README.md @@ -0,0 +1,255 @@ +# XServiceLocator + +*"Craving for proper Dependency Injection?"* + +

+ +

+ +# [![Build Status](https://travis-ci.com/quickbirdstudios/XServiceLocator.svg?branch=master)](https://travis-ci.com/quickbirdstudios/XServiceLocator) [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/XServiceLocator.svg)](https://cocoapods.org/pods/XServiceLocator) [![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/XServiceLocator) [![Platform](https://img.shields.io/badge/platform-iOS-lightgrey.svg)](https://github.com/quickbirdstudios/XServiceLocator) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/quickbirdstudios/XServiceLocator/blob/master/LICENSE) + +XServiceLocator is a light-weight Swift library/framework for dynamically providing objects with the dependencies they need. The library is based on the Service Locator pattern. The idea is that objects get their dependencies from a certain store. XServiceLocator enables you to use [seamless dependency injection](https://quickbirdstudios.com/blog/swift-dependency-injection-service-locators/) throughout your iOS app without the need for any background magic. + +## πŸ”© Components + +### πŸ“¦ Container + +Stores the configuration on how to create instances of the registered types + +### πŸ› οΈ Resolver + +Resolves the actual implementation for a type, by creating an instance of a class, using the configuration of the Container + +### 🏭 ServiceFactory + +A generic factory solution for creating instances of the generic type + + +## πŸƒβ€β™€οΈ Getting started + +### πŸšΆβ€β™€οΈ Basic steps + +1. Register all of the types using any of the two `register` methods with the container. + + +```swift +let container = Container() + .register(Int.self, instance: 10) + .register(Double.self) { _ in 20 } +``` + +2. Wherever you need an instance of the type, you can access it using any of the two `resolve` methods of the `Resolver`. Let's first get the Resolver from the `Container` and then use the resolver to resolve the dependencies. + +```swift + let resolver = container.resolver + + let intValue = try! resolver.resolve(Int.self) + let doubleValue: Double = try! resolver.resolve() +``` + +### 🎲 Custom Objects + +You can also register custom types or instances for protocols, such as: + +```swift +// Setting up + +protocol Shape { + var name: String { get } +} + +class Circle: Shape { + let name = "Circle" + let radius: Double + + init(radius: Double) { + self.radius = radius + } + +} + +class Rectangle: Shape { + let name = "Rectangle" + let width: Double + let height: Double + + init(width: Double, height: Double) { + self.width = width + self.height = height + } +} + +struct Drawing { + let shape: Shape +} + +// Registering all the dependencies + +let container = Container() + .register(Shape.self, instance: Circle(radius: 10)) + .register(Circle.self) { _ in Circle(radius: 20) } + .register(Rectangle.self, instance: Rectangle(width: 30, height: 15)) + .register(Drawing.self) { _ in + let shape = Rectangle(width: 10, height: 5) + return Drawing(shape: shape) + } + + +// Resolving the dependencies + +let resolver = container.resolver + +let rectangle = try! resolver.resolve(Rectangle.self) +let shape = try! resolver.resolve(Shape.self) +let circle: Circle = try! resolver.resolve() +let drawing: Drawing = try! resolver.resolve() + +// Accessing values + +print(rectangle.name) // Rectangle +print(shape.name) // Circle +print(circle.name) // Circle +print(drawing.shape.name) // Rectangle + +print("\(rectangle.width), \(rectangle.height)") // 30.0, 15.0 +print((shape as! Circle).radius) // 10.0 +print(circle.radius) // 20.0 +``` + + +### 🎩 Using already registered instances for subsequent registrations + +```swift +// Registering all the dependencies +let container = Container() + .register(Double.self, instance: 30) + .register(Rectangle.self, instance: Rectangle(width: 10, height: 20)) + .register(Circle.self) { resolver in Circle(radius: try! resolver.resolve()) } + + +// Resolving the dependencies + +let resolver = container.resolver + +let circle: Circle = try! resolver.resolve() + + +// Accessing values + +circle.radius // 30.0 +``` + +## πŸ‘Ά Using (Child) Dependency Resolver + +A container can have another resolver as a dependency which can be used for resolution if the main resolver (container) fails to resolve the dependency. + +```swift +// Registering all the dependencies + +let dependency = Container() + .register(Double.self, instance: 100) + .register(Shape.self, instance: Rectangle(width: 10, height: 20)) + +let container = Container(dependency: dependency) + .register(Rectangle.self, instance: Rectangle(width: 15, height: 7.5)) + + +// Resolving the dependencies + +let resolver = container.resolver + +let shapeRectangle = try! resolver.resolve(Shape.self) as! Rectangle +let rectangle: Rectangle = try! resolver.resolve() +let doubleValue: Double = try! resolver.resolve() + + +// Accessing values + +print("\(shapeRectangle.width), \(shapeRectangle.height)") // 10.0, 20.0 +print("\(rectangle.width), \(rectangle.height)") // 15.0, 7.5 +print(doubleValue) // 100 +``` + +## πŸ’ͺ Array of Resolvers + +An array of resolvers also act as a resolver. As soon as any element of the array is able to resolve successfully, the object is returned. + +```swift +// Registering all the dependencies + +let container = Container() + .register(Int.self, instance: 10) + .register(Double.self, instance: 20) + +let container1 = Container() + .register(Float.self, instance: 30) + .register(Double.self, instance: 50) + +let arrayOfResolvers: Resolver = [ + container, + container1, +] + + +// Resolving the dependencies +let intValue = try! arrayOfResolvers.resolve(Int.self) // 10 +let floatValue = try! arrayOfResolvers.resolve(Float.self) // 30.0 +let doubleValue = try! arrayOfResolvers.resolve(Double.self) // 20.0 +``` + +## β€πŸ€·β€β™‚οΈ Why the ServiceLocator pattern? +1. Loose coupling between classes/objects +2. Provides better testability +3. Provides extensibility. New instances can be easily registered and implementations can be switched without changing a lot. + +## β€πŸ€” Why XServiceLocator? +1. **Plug and Play**. Integrate the library and you are ready to go. +2. **Supports Array of resolvers**. A combination of resolvers can be used for resolution of a type. +3. Supports registration and resolution of any type. +4. Developed and maintained by a group of developers who really care about the community and the quality of their solutions. +5. Everything is built using Swift only. No Objective-C legacy code. + +## πŸ›  Installation + +#### CocoaPods + +To integrate `XServiceLocator` into your Xcode project using CocoaPods, add this to your `Podfile`: + +```ruby +pod 'XServiceLocator', '~> 1.0' +``` + +#### Carthage + +To integrate `XServiceLocator` into your Xcode project using Carthage, add this to your `Cartfile`: + +``` +github "quickbirdstudios/XServiceLocator" ~> 1.0 +``` + +Then run `carthage update`. + +If this is your first time using Carthage in the project, you'll need to go through some additional steps as explained [over at Carthage](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application). + +#### Swift Package Manager + +See [this WWDC presentation](https://developer.apple.com/videos/play/wwdc2019/408/) about more information how to adopt Swift packages in your app. + +Specify `https://github.com/quickbirdstudios/XServiceLocator.git` as the `XServiceLocator` package link. + +#### Manually + +If you prefer not to use any of the dependency managers, you can integrate `XServiceLocator` into your iOS project manually, by downloading the source code and placing the files in your project directory. + +## πŸ‘€ Author +This framework is created with ❀️ by [QuickBird Studios](https://quickbirdstudios.com). + +## ❀️ Contributing + +Open an issue if you need help, if you found a bug, or if you want to discuss a feature request. + +Open a PR if you want to make changes to XServiceLocator. + +## πŸ“ƒ License + +XServiceLocator is released under an MIT license. See [License.md](https://github.com/quickbirdstudios/XServiceLocator/blob/master/LICENSE) for more information. diff --git a/Sources/XServiceLocator/Container.swift b/Sources/XServiceLocator/Container.swift new file mode 100644 index 0000000..2b60c91 --- /dev/null +++ b/Sources/XServiceLocator/Container.swift @@ -0,0 +1,101 @@ +// +// Container.swift +// XServiceLocator +// +// Copyright Β© 2020 QuickBird Studios GmbH. All rights reserved. +// + +import Foundation + +/// Stores the configuration on how to create instances of the registered types +public class Container { + let dependency: Resolver? + let factories: [AnyServiceFactory] + + /// Initializes a new container with an optional child resolver + /// - Parameter dependency: a child resolver that is used when the dependency cannot be resolved by this container. + /// However, the container first tries to resolve the dependencies by itself + public init(dependency: Resolver? = nil) { + self.dependency = dependency + self.factories = [] + } + + /// Initializes a new container with an optional child resolver and an array of factories + /// - Parameter dependency: a child resolver that is used when the dependency cannot be resolved by this container. + /// However, the container first tries to resolve the dependencies by itself + /// - Parameter factories: an array of already registered types. + init(dependency: Resolver? = nil, factories: [AnyServiceFactory]) { + self.dependency = dependency + self.factories = factories + } + + // MARK: - Register + + /// Register the `instance` as a object of Type `ServiceType`. The same instance will be resolved on every resolve call. + /// - Parameter interface: The target type `ServiceType` to register the object as + /// - Parameter instance: The instance to register + public func register(_ interface: ServiceType.Type, instance: ServiceType) -> Container { + return register(interface) { _ in instance } + } + + /// Register the `factory` as a template to create object of Type `ServiceType`. The `factory` will be called on + /// every resolve call which means that a new instance will be created on every resolve call. + /// - Parameter interface: The target type `ServiceType` to register the object as + /// - Parameter factory: The factory/closure that is used to create the instance of type `ServiceType` + public func register(_ interface: ServiceType.Type, + _ factory: @escaping (Resolver) -> ServiceType) -> Container { + + let newFactory = BasicServiceFactory(interface, factory: { resolver in + factory(resolver) + }) + return .init(dependency: dependency, factories: factories + [AnyServiceFactory(newFactory)]) + } +} + +// MARK: - Resolver + +extension Container: Resolver { + /// returns a resolver that can be used to resolve the container objects + public var resolver: Resolver { return self as Resolver } + + /// Resolves to an instance of type `ServiceType` and throws if no instance/factory has already been registered. + /// In case the container is not able to resolve the instance type, it will try to resolve it using its dependency. + /// An `Error.factoryNotFound` will be thrown in case the resolution is not possible. + public func resolve(_ type: ServiceType.Type) throws -> ServiceType { + guard let factory = factories.first(where: { $0.supports(type) }) else { + guard let resolvedByDependency = try dependency?.resolve(type) else { + throw Container.unableToResolve(type) + } + + return resolvedByDependency + } + + return try factory.resolve(self) + } + + /// Resolves to an instance of type `ServiceType` and throws if no instance/factory has already been registered. + /// In case the container is not able to resolve the instance type, it will try to resolve it using its dependency. + /// An `Error.factoryNotFound` will be thrown in case the resolution is not possible. + public func resolve() throws -> ServiceType { + return try resolve(ServiceType.self) + } +} + +// MARK: - Error + +extension Container { + public static func unableToResolve(_ type: ServiceType.Type) -> Error { + return .factoryNotFound(service: type) + } + + public enum Error: Swift.Error, Equatable { + public static func == (lhs: Container.Error, rhs: Container.Error) -> Bool { + switch (lhs, rhs) { + case let (.factoryNotFound(lhsType), .factoryNotFound(rhsType)): + return lhsType == rhsType + } + } + + case factoryNotFound(service: Any.Type) + } +} diff --git a/Sources/XServiceLocator/Extensions/Array+Resolver.swift b/Sources/XServiceLocator/Extensions/Array+Resolver.swift new file mode 100644 index 0000000..808231c --- /dev/null +++ b/Sources/XServiceLocator/Extensions/Array+Resolver.swift @@ -0,0 +1,25 @@ +// +// Array+Resolver.swift +// XServiceLocator +// +// Copyright Β© 2020 QuickBird Studios GmbH. All rights reserved. +// + +import Foundation + +extension Array: Resolver where Element == Resolver { + + /// tries to resolve to an instance of `ServiceType` and returns the instance as soon as the first element(resolver) + /// resolves it successfully. + public func resolve(_ type: ServiceType.Type) throws -> ServiceType { + guard !isEmpty else { throw EmptyResolverError() } + + return try firstToResolve({ try $0.resolve(type) }) + } + + public func resolve() throws -> ServiceType { + return try resolve(ServiceType.self) + } + + struct EmptyResolverError: Error { } +} diff --git a/Sources/XServiceLocator/Extensions/Collection+FirstToResolve.swift b/Sources/XServiceLocator/Extensions/Collection+FirstToResolve.swift new file mode 100644 index 0000000..f212c48 --- /dev/null +++ b/Sources/XServiceLocator/Extensions/Collection+FirstToResolve.swift @@ -0,0 +1,22 @@ +// +// Collection+FirstToResolve.swift +// XServiceLocator +// +// Copyright Β© 2020 QuickBird Studios GmbH. All rights reserved. +// + +import Foundation + +// MARK: Internal API + +extension Collection where Index == Int { + + /// tries to resolve the `ServiceType` and returns the instance as soon as the first element resolves it successfully. + func firstToResolve(_ factory: (Element) throws -> ServiceType) throws -> ServiceType { + for element in self { + if let resolved = try? factory(element) { return resolved } + } + + throw Container.unableToResolve(ServiceType.self) + } +} diff --git a/Sources/XServiceLocator/Resolver.swift b/Sources/XServiceLocator/Resolver.swift new file mode 100644 index 0000000..8b6b0c4 --- /dev/null +++ b/Sources/XServiceLocator/Resolver.swift @@ -0,0 +1,17 @@ +// +// Resolver.swift +// X +// +// Copyright Β© 2020 QuickBird Studios GmbH. All rights reserved. +// + +import Foundation + +public protocol Resolver { + /// Resolves to an instance of type `ServiceType` and throws if no instance/factory has already been registered. + func resolve(_ type: ServiceType.Type) throws -> ServiceType + + /// makes use of type inference to resolve to an instance of type `ServiceType` and throws if no instance/factory + /// has already been registered. Makes use o + func resolve() throws -> ServiceType +} diff --git a/Sources/XServiceLocator/ServiceFactory/AnyServiceFactory.swift b/Sources/XServiceLocator/ServiceFactory/AnyServiceFactory.swift new file mode 100644 index 0000000..9cf1219 --- /dev/null +++ b/Sources/XServiceLocator/ServiceFactory/AnyServiceFactory.swift @@ -0,0 +1,31 @@ +// +// AnyServiceFactory.swift +// XServiceLocator +// +// Copyright Β© 2020 QuickBird Studios GmbH. All rights reserved. +// + +import Foundation + +/// Type-erased implementation of `ServiceFactory` +final class AnyServiceFactory { + private let _resolve: (Resolver) throws -> Any + private let _supports: (Any.Type) -> Bool + + init(_ serviceFactory: T) { + + self._resolve = { resolver -> Any in + try serviceFactory.resolve(resolver) + } + + self._supports = { $0 == T.ServiceType.self } + } + + func resolve(_ resolver: Resolver) throws -> ServiceType { + return try _resolve(resolver) as! ServiceType + } + + func supports(_ serviceType: ServiceType.Type) -> Bool { + return _supports(serviceType) + } +} diff --git a/Sources/XServiceLocator/ServiceFactory/BasicServiceFactory.swift b/Sources/XServiceLocator/ServiceFactory/BasicServiceFactory.swift new file mode 100644 index 0000000..905e38b --- /dev/null +++ b/Sources/XServiceLocator/ServiceFactory/BasicServiceFactory.swift @@ -0,0 +1,25 @@ +// +// BasicServiceFactory.swift +// XServiceLocator +// +// Copyright Β© 2020 QuickBird Studios GmbH. All rights reserved. +// + +import Foundation + +/// Implementation of `ServiceFactory` that is used to generate instances of the generic type `ServiceType` +struct BasicServiceFactory: ServiceFactory { + private let factory: (Resolver) throws -> ServiceType + + /// initializes the factory with type `ServiceType` and a factory for creation of the type + /// - Parameter type: The type of the object that this factory supports/creates + /// - Parameter factory: The factory method that takes a resolver and should return an instance of the type + init(_ type: ServiceType.Type, factory: @escaping (Resolver) throws -> ServiceType) { + self.factory = factory + } + + /// tries resolving/generating the instance of generic type using the passed `Resolver` + func resolve(_ resolver: Resolver) throws -> ServiceType { + return try factory(resolver) + } +} diff --git a/Sources/XServiceLocator/ServiceFactory/ServiceFactory.swift b/Sources/XServiceLocator/ServiceFactory/ServiceFactory.swift new file mode 100644 index 0000000..f27d017 --- /dev/null +++ b/Sources/XServiceLocator/ServiceFactory/ServiceFactory.swift @@ -0,0 +1,23 @@ +// +// ServiceFactory.swift +// XServiceLocator +// +// Copyright Β© 2020 QuickBird Studios GmbH. All rights reserved. +// + +import Foundation + +/// Generic factory solution that is used to resolve/create instances of type `ServiceType` +protocol ServiceFactory { + associatedtype ServiceType + + /// tries resolving/generating the instance of generic type using the passed `Resolver` + func resolve(_ resolver: Resolver) throws -> ServiceType +} + +extension ServiceFactory { + /// Checks if the service factory supports creation of the specific `ServiceType` + func supports(_ type: ServiceType.Type) -> Bool { + return type == ServiceType.self + } +} diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift new file mode 100644 index 0000000..db53c7f --- /dev/null +++ b/Tests/LinuxMain.swift @@ -0,0 +1,7 @@ +import XCTest + +import XServiceLocatorTests + +var tests = [XCTestCaseEntry]() +tests += XServiceLocator.allTests() +XCTMain(tests) diff --git a/Tests/XServiceLocatorTests/XServiceLocatorTests.swift b/Tests/XServiceLocatorTests/XServiceLocatorTests.swift new file mode 100644 index 0000000..d9f646e --- /dev/null +++ b/Tests/XServiceLocatorTests/XServiceLocatorTests.swift @@ -0,0 +1,190 @@ +// +// XServiceLocatorTests.swift +// XServiceLocatorTests +// +// Copyright Β© 2020 QuickBird Studios GmbH. All rights reserved. +// + +@testable import XServiceLocator +import XCTest + +class XServiceLocatorTests: XCTestCase { + + func test_registerInstance_resolvesCorrectly() { + let resolver = Container() + .register(TestProtocol.self, instance: TestClass(id: 1, score: .random(in: 0...10))) + let instance: TestProtocol = try! resolver.resolve() + + XCTAssert(instance is TestClass) + } + + func test_registerFactory_resolvesCorrectly() { + let resolver = Container() + .register(TestProtocol.self) { _ in TestClass(id: 1, score: .random(in: 0...10)) } + let instance: TestProtocol = try! resolver.resolve() + + XCTAssert(instance is TestClass) + } + + func test_registerInstance_resolvesToSameInstanceEveryTime() { + let resolver = Container() + .register(TestClass.self, instance: TestClass(id: 1, score: 2)) + + let instance1: TestClass = try! resolver.resolve() + let instance2: TestClass = try! resolver.resolve() + + XCTAssertTrue(instance1 === instance2) + } + + func test_registerFactory_resolvesToNewInstanceEveryTime() { + let resolver = Container() + .register(TestClass.self) { _ in TestClass(id: 5, score: 10) } + + let instance1: TestClass = try! resolver.resolve() + let instance2: TestClass = try! resolver.resolve() + + XCTAssertFalse(instance1 === instance2) + } + + func test_registerProtocolAndClass_resolvesCorrectly() { + let resolver = Container() + .register(TestProtocol.self, instance: TestClass(id: 1, score: 10)) + .register(TestClass.self, instance: TestClass(id: 2, score: 20)) + + let resolvedProtocol: TestProtocol = try! resolver.resolve() + let resolvedInstance: TestClass = try! resolver.resolve() + + XCTAssert(resolvedProtocol is TestClass) + + XCTAssertEqual(resolvedProtocol.id, 1) + XCTAssertEqual((resolvedProtocol as! TestClass).score, 10) + + XCTAssertEqual(resolvedInstance.id, 2) + XCTAssertEqual(resolvedInstance.score, 20) + } + + func test_registerSingleInstance_resolvesCorrectly() { + let expectedInstance = TestClass(id: 1, score: 10) + let resolver = Container().register(TestProtocol.self, instance: expectedInstance) + let instance: TestProtocol = try! resolver.resolve() + + guard let castedInstance = instance as? TestClass else { + XCTFail("Expected Instance to be of type `\(String(describing: TestClass.self))`") + return + } + + XCTAssert(castedInstance === expectedInstance, + "Expected resolved instance and original instance to be the exact same object") + } + + func test_nonregisteredInstance_factoryNotFound() throws { + let resolver = Container().register(TestProtocol.self, instance: TestStruct(id: 1)) + + XCTAssertThrowsError(try resolver.resolve(DummyProtocol.self)) { error in + XCTAssertEqual(error as? Container.Error, Container.Error.factoryNotFound(service: DummyProtocol.self)) + } + } + + func test_registerTwoImplementations_lastOneOverridesPreviousOne() { + let first = TestStruct(id: 1) + let second = TestStruct(id: 2) + + let resolver = Container().register(TestProtocol.self, instance: first) + .register(TestProtocol.self, instance: second) + + let resolved: TestProtocol = try! resolver.resolve() + + XCTAssertEqual(resolved.id, first.id) + XCTAssertNotEqual(resolved.id, second.id) + } + + func test_alreadyRegisteredDependencies_canBeResolvedForSubsequenetRegistrations() { + let container = Container() + .register(Int.self, instance: 100) + .register(TestProtocol.self) { resolver in TestStruct(id: try! resolver.resolve(Int.self)) } + + let resolvedInt = try! container.resolve(Int.self) + let resolvedObject = try! container.resolve(TestProtocol.self) + + XCTAssertEqual(resolvedInt, resolvedObject.id) + } + + func test_registerInDependency_canBeResolvedByParent() { + let expectedId = 100 + let first = Container().register(Int.self, instance: expectedId) + let second = Container(dependency: first) + .register(TestProtocol.self) { resolver in TestStruct(id: try! resolver.resolve(Int.self)) } + + let resolvedIntByFirst = try! first.resolve(Int.self) + let resolvedIntBySecond = try! second.resolve(Int.self) + + XCTAssertEqual(resolvedIntByFirst, resolvedIntBySecond) + + let resolved = try! second.resolve(TestProtocol.self) + XCTAssertEqual(resolved.id, expectedId) + } + + func test_registerInDependency_isOverridenByParentWhenAccessViaParent() { + let first = Container().register(Int.self, instance: 100) + let second = Container(dependency: first) + .register(TestProtocol.self) { resolver in TestStruct(id: 150) } + .register(Int.self, instance: 200) + + let resolvedIntByFirst = try! first.resolve(Int.self) + let resolvedIntBySecond = try! second.resolve(Int.self) + + XCTAssertNotEqual(resolvedIntByFirst, resolvedIntBySecond) + XCTAssertEqual(resolvedIntByFirst, 100) + XCTAssertEqual(resolvedIntBySecond, 200) + } + + func test_ArrayOfResolvers_resolvesAll() { + let resolver: Resolver = [ + Container().register(Int.self, instance: 100), + Container().register(Float.self, instance: 200), + Container().register(Double.self, instance: 300), + ] + + XCTAssertEqual(try! resolver.resolve(Int.self), 100) + XCTAssertEqual(try! resolver.resolve(Float.self), 200) + XCTAssertEqual(try! resolver.resolve(Double.self), 300) + } + + func test_arrayOfResolvers_resolvesTheFirstMatchInTheArray() { + let first = Container().register(Int.self, instance: 100) + let second = Container().register(Int.self, instance: 200) + let third = Container().register(Int.self, instance: 300) + + let resolver1: Resolver = [first, second] + let resolver2: Resolver = [first, third] + let resolver3: Resolver = [first, second, third] + + XCTAssertEqual(try! resolver1.resolve(Int.self), 100) + XCTAssertEqual(try! resolver2.resolve(Int.self), 100) + XCTAssertEqual(try! resolver3.resolve(Int.self), 100) + + let resolver4: Resolver = [second, third] + XCTAssertEqual(try! resolver4.resolve(Int.self), 200) + + let resolver5: Resolver = [first, second, third].reversed() + XCTAssertEqual(try! resolver5.resolve(Int.self), 300) + } + + func test_emptyArrayOfResolvers_emptyResolverError() { + let resolver: Resolver = [] + + XCTAssertThrowsError(try resolver.resolve(Int.self)) { error in + XCTAssert(error is Array.EmptyResolverError) + } + } + + func test_arrayOfResolvers_factoryNotFound() { + let resolver: Resolver = [ + Container().register(Double.self, instance: 100) + ] + + XCTAssertThrowsError(try resolver.resolve(Int.self)) { error in + XCTAssertEqual(error as? Container.Error, Container.Error.factoryNotFound(service: Int.self)) + } + } +} diff --git a/Tests/XServiceLocatorTests/utils/DummyProtocol.swift b/Tests/XServiceLocatorTests/utils/DummyProtocol.swift new file mode 100644 index 0000000..b611857 --- /dev/null +++ b/Tests/XServiceLocatorTests/utils/DummyProtocol.swift @@ -0,0 +1,11 @@ +// +// DummyProtocol.swift +// XServiceLocatorTests +// +// Copyright Β© 2020 QuickBird Studios GmbH. All rights reserved. +// + +import Foundation + +protocol DummyProtocol { +} diff --git a/Tests/XServiceLocatorTests/utils/TestClass.swift b/Tests/XServiceLocatorTests/utils/TestClass.swift new file mode 100644 index 0000000..1f63212 --- /dev/null +++ b/Tests/XServiceLocatorTests/utils/TestClass.swift @@ -0,0 +1,18 @@ +// +// TestClass.swift +// XServiceLocatorTests +// +// Copyright Β© 2020 QuickBird Studios GmbH. All rights reserved. +// + +import Foundation + +class TestClass: TestProtocol { + let id: Int + let score: Double + + init(id: Int, score: Double) { + self.id = id + self.score = score + } +} diff --git a/Tests/XServiceLocatorTests/utils/TestProtocol.swift b/Tests/XServiceLocatorTests/utils/TestProtocol.swift new file mode 100644 index 0000000..90ef3f8 --- /dev/null +++ b/Tests/XServiceLocatorTests/utils/TestProtocol.swift @@ -0,0 +1,12 @@ +// +// TestProtocol.swift +// XServiceLocatorTests +// +// Copyright Β© 2020 QuickBird Studios GmbH. All rights reserved. +// + +import Foundation + +public protocol TestProtocol { + var id: Int { get } +} diff --git a/Tests/XServiceLocatorTests/utils/TestStruct.swift b/Tests/XServiceLocatorTests/utils/TestStruct.swift new file mode 100644 index 0000000..0e1a9c9 --- /dev/null +++ b/Tests/XServiceLocatorTests/utils/TestStruct.swift @@ -0,0 +1,12 @@ +// +// TestStruct.swift +// XServiceLocatorTests +// +// Copyright Β© 2020 QuickBird Studios GmbH. All rights reserved. +// + +import Foundation + +struct TestStruct: TestProtocol, Equatable { + let id: Int +} diff --git a/XServiceLocator.jpeg b/XServiceLocator.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..1d977ba4d1c139657263bd95ae5afb24c4ba1ebf GIT binary patch literal 164032 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�b78_?N5mFiyRuyzmB}?kPQcGoO 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 'MIT' } + spec.author = { 'Stefan Kofler' => 'stefan.kofler@quickbirdstudios.com', 'Mathias Quintero' => 'mathias.quintero@quickbirdstudios.com', 'Ghulam Nasir' => 'ghulam.nasir@quickbirdstudios.com' } + spec.source = { :git => 'https://github.com/quickbirdstudios/xservicelocator.git', :tag => spec.version } + spec.source_files = 'Sources/XServiceLocator/**/*.swift' + spec.framework = 'Foundation' + spec.swift_version = '5.1' + spec.ios.deployment_target = '8.0' + spec.osx.deployment_target = '10.9' +end diff --git a/XServiceLocator.xcodeproj/Info.plist b/XServiceLocator.xcodeproj/Info.plist new file mode 100644 index 0000000..64d65ca --- /dev/null +++ b/XServiceLocator.xcodeproj/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/XServiceLocator.xcodeproj/project.pbxproj b/XServiceLocator.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a4b4863 --- /dev/null +++ b/XServiceLocator.xcodeproj/project.pbxproj @@ -0,0 +1,566 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 509A590724F56B5000AD4B81 /* XServiceLocator.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 509A58F624F56B3D00AD4B81 /* XServiceLocator.framework */; }; + 509A591624F56C4F00AD4B81 /* XServiceLocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 509A591424F56C4F00AD4B81 /* XServiceLocator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 509A591824F56CB200AD4B81 /* TestClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ED800924E2C2150019F25F /* TestClass.swift */; }; + 509A591924F56CB200AD4B81 /* TestStruct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ED800A24E2C2150019F25F /* TestStruct.swift */; }; + 509A591A24F56CB200AD4B81 /* TestProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ED800B24E2C2150019F25F /* TestProtocol.swift */; }; + 509A591B24F56CB200AD4B81 /* DummyProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ED800C24E2C2150019F25F /* DummyProtocol.swift */; }; + 509A591C24F56CB200AD4B81 /* XServiceLocatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ED800D24E2C2150019F25F /* XServiceLocatorTests.swift */; }; + 50F284CA24F5B36D00F3B5EE /* Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ED7FFB24E2C2150019F25F /* Resolver.swift */; }; + 50F284CB24F5B36D00F3B5EE /* Container.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ED7FFC24E2C2150019F25F /* Container.swift */; }; + 50F284CC24F5B36D00F3B5EE /* Collection+FirstToResolve.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ED7FFE24E2C2150019F25F /* Collection+FirstToResolve.swift */; }; + 50F284CD24F5B36D00F3B5EE /* Array+Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ED7FFF24E2C2150019F25F /* Array+Resolver.swift */; }; + 50F284CE24F5B36D00F3B5EE /* AnyServiceFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ED800124E2C2150019F25F /* AnyServiceFactory.swift */; }; + 50F284CF24F5B36D00F3B5EE /* ServiceFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ED800224E2C2150019F25F /* ServiceFactory.swift */; }; + 50F284D024F5B36D00F3B5EE /* BasicServiceFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ED800324E2C2150019F25F /* BasicServiceFactory.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 509A590824F56B5000AD4B81 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0EADF79A21B1689F00542140 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 509A58F524F56B3D00AD4B81; + remoteInfo = XServiceLocator; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 509A58F624F56B3D00AD4B81 /* XServiceLocator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = XServiceLocator.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 509A591424F56C4F00AD4B81 /* XServiceLocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XServiceLocator.h; sourceTree = ""; }; + 509A591524F56C4F00AD4B81 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 509A591D24F56D5700AD4B81 /* XServiceLocatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XServiceLocatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 50ED7FFB24E2C2150019F25F /* Resolver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Resolver.swift; sourceTree = ""; }; + 50ED7FFC24E2C2150019F25F /* Container.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Container.swift; sourceTree = ""; }; + 50ED7FFE24E2C2150019F25F /* Collection+FirstToResolve.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Collection+FirstToResolve.swift"; sourceTree = ""; }; + 50ED7FFF24E2C2150019F25F /* Array+Resolver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Array+Resolver.swift"; sourceTree = ""; }; + 50ED800124E2C2150019F25F /* AnyServiceFactory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnyServiceFactory.swift; sourceTree = ""; }; + 50ED800224E2C2150019F25F /* ServiceFactory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceFactory.swift; sourceTree = ""; }; + 50ED800324E2C2150019F25F /* BasicServiceFactory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasicServiceFactory.swift; sourceTree = ""; }; + 50ED800424E2C2150019F25F /* ServiceLocator.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ServiceLocator.podspec; sourceTree = ""; }; + 50ED800624E2C2150019F25F /* LinuxMain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinuxMain.swift; sourceTree = ""; }; + 50ED800924E2C2150019F25F /* TestClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestClass.swift; sourceTree = ""; }; + 50ED800A24E2C2150019F25F /* TestStruct.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestStruct.swift; sourceTree = ""; }; + 50ED800B24E2C2150019F25F /* TestProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestProtocol.swift; sourceTree = ""; }; + 50ED800C24E2C2150019F25F /* DummyProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DummyProtocol.swift; sourceTree = ""; }; + 50ED800D24E2C2150019F25F /* XServiceLocatorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XServiceLocatorTests.swift; sourceTree = ""; }; + 50ED800E24E2C2150019F25F /* Package.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; + 50ED800F24E2C2150019F25F /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 50ED801024E2C2150019F25F /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 509A58F324F56B3D00AD4B81 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 509A58FF24F56B5000AD4B81 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 509A590724F56B5000AD4B81 /* XServiceLocator.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0EADF79921B1689F00542140 = { + isa = PBXGroup; + children = ( + 50ED7FF924E2C2150019F25F /* Sources */, + 50ED800524E2C2150019F25F /* Tests */, + 50ED801024E2C2150019F25F /* LICENSE */, + 50ED800F24E2C2150019F25F /* README.md */, + 50ED800E24E2C2150019F25F /* Package.swift */, + 50ED800424E2C2150019F25F /* ServiceLocator.podspec */, + 509A591324F56C4F00AD4B81 /* XServiceLocator */, + 50ED804B24E2C3620019F25F /* Products */, + 509A58F624F56B3D00AD4B81 /* XServiceLocator.framework */, + 509A591D24F56D5700AD4B81 /* XServiceLocatorTests.xctest */, + ); + sourceTree = ""; + }; + 509A591324F56C4F00AD4B81 /* XServiceLocator */ = { + isa = PBXGroup; + children = ( + 509A591424F56C4F00AD4B81 /* XServiceLocator.h */, + 509A591524F56C4F00AD4B81 /* Info.plist */, + ); + path = XServiceLocator; + sourceTree = ""; + }; + 50ED7FF924E2C2150019F25F /* Sources */ = { + isa = PBXGroup; + children = ( + 50ED7FFA24E2C2150019F25F /* XServiceLocator */, + ); + path = Sources; + sourceTree = ""; + }; + 50ED7FFA24E2C2150019F25F /* XServiceLocator */ = { + isa = PBXGroup; + children = ( + 50ED7FFB24E2C2150019F25F /* Resolver.swift */, + 50ED7FFC24E2C2150019F25F /* Container.swift */, + 50ED7FFD24E2C2150019F25F /* Extensions */, + 50ED800024E2C2150019F25F /* ServiceFactory */, + ); + path = XServiceLocator; + sourceTree = ""; + }; + 50ED7FFD24E2C2150019F25F /* Extensions */ = { + isa = PBXGroup; + children = ( + 50ED7FFE24E2C2150019F25F /* Collection+FirstToResolve.swift */, + 50ED7FFF24E2C2150019F25F /* Array+Resolver.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 50ED800024E2C2150019F25F /* ServiceFactory */ = { + isa = PBXGroup; + children = ( + 50ED800124E2C2150019F25F /* AnyServiceFactory.swift */, + 50ED800224E2C2150019F25F /* ServiceFactory.swift */, + 50ED800324E2C2150019F25F /* BasicServiceFactory.swift */, + ); + path = ServiceFactory; + sourceTree = ""; + }; + 50ED800524E2C2150019F25F /* Tests */ = { + isa = PBXGroup; + children = ( + 50ED800624E2C2150019F25F /* LinuxMain.swift */, + 50ED800724E2C2150019F25F /* XServiceLocatorTests */, + ); + path = Tests; + sourceTree = ""; + }; + 50ED800724E2C2150019F25F /* XServiceLocatorTests */ = { + isa = PBXGroup; + children = ( + 50ED800824E2C2150019F25F /* utils */, + 50ED800D24E2C2150019F25F /* XServiceLocatorTests.swift */, + ); + path = XServiceLocatorTests; + sourceTree = ""; + }; + 50ED800824E2C2150019F25F /* utils */ = { + isa = PBXGroup; + children = ( + 50ED800924E2C2150019F25F /* TestClass.swift */, + 50ED800A24E2C2150019F25F /* TestStruct.swift */, + 50ED800B24E2C2150019F25F /* TestProtocol.swift */, + 50ED800C24E2C2150019F25F /* DummyProtocol.swift */, + ); + path = utils; + sourceTree = ""; + }; + 50ED804B24E2C3620019F25F /* Products */ = { + isa = PBXGroup; + children = ( + ); + path = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 509A58F124F56B3D00AD4B81 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 509A591624F56C4F00AD4B81 /* XServiceLocator.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 509A58F524F56B3D00AD4B81 /* XServiceLocator */ = { + isa = PBXNativeTarget; + buildConfigurationList = 509A58FB24F56B3D00AD4B81 /* Build configuration list for PBXNativeTarget "XServiceLocator" */; + buildPhases = ( + 509A58F124F56B3D00AD4B81 /* Headers */, + 509A58F224F56B3D00AD4B81 /* Sources */, + 509A58F324F56B3D00AD4B81 /* Frameworks */, + 509A58F424F56B3D00AD4B81 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = XServiceLocator; + productName = XServiceLocator; + productReference = 509A58F624F56B3D00AD4B81 /* XServiceLocator.framework */; + productType = "com.apple.product-type.framework"; + }; + 509A590124F56B5000AD4B81 /* XServiceLocatorTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 509A590A24F56B5000AD4B81 /* Build configuration list for PBXNativeTarget "XServiceLocatorTests" */; + buildPhases = ( + 509A58FE24F56B5000AD4B81 /* Sources */, + 509A58FF24F56B5000AD4B81 /* Frameworks */, + 509A590024F56B5000AD4B81 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 509A590924F56B5000AD4B81 /* PBXTargetDependency */, + ); + name = XServiceLocatorTests; + productName = XServiceLocatorTests; + productReference = 509A591D24F56D5700AD4B81 /* XServiceLocatorTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0EADF79A21B1689F00542140 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1160; + LastUpgradeCheck = 1000; + ORGANIZATIONNAME = "QuickBird Studios GmbH"; + TargetAttributes = { + 509A58F524F56B3D00AD4B81 = { + CreatedOnToolsVersion = 11.6; + }; + 509A590124F56B5000AD4B81 = { + CreatedOnToolsVersion = 11.6; + }; + }; + }; + buildConfigurationList = 0EADF79D21B1689F00542140 /* Build configuration list for PBXProject "XServiceLocator" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 0EADF79921B1689F00542140; + productRefGroup = 0EADF79921B1689F00542140; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 509A58F524F56B3D00AD4B81 /* XServiceLocator */, + 509A590124F56B5000AD4B81 /* XServiceLocatorTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 509A58F424F56B3D00AD4B81 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 509A590024F56B5000AD4B81 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 509A58F224F56B3D00AD4B81 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 50F284CA24F5B36D00F3B5EE /* Resolver.swift in Sources */, + 50F284CB24F5B36D00F3B5EE /* Container.swift in Sources */, + 50F284CC24F5B36D00F3B5EE /* Collection+FirstToResolve.swift in Sources */, + 50F284CD24F5B36D00F3B5EE /* Array+Resolver.swift in Sources */, + 50F284CE24F5B36D00F3B5EE /* AnyServiceFactory.swift in Sources */, + 50F284CF24F5B36D00F3B5EE /* ServiceFactory.swift in Sources */, + 50F284D024F5B36D00F3B5EE /* BasicServiceFactory.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 509A58FE24F56B5000AD4B81 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 509A591824F56CB200AD4B81 /* TestClass.swift in Sources */, + 509A591924F56CB200AD4B81 /* TestStruct.swift in Sources */, + 509A591A24F56CB200AD4B81 /* TestProtocol.swift in Sources */, + 509A591B24F56CB200AD4B81 /* DummyProtocol.swift in Sources */, + 509A591C24F56CB200AD4B81 /* XServiceLocatorTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 509A590924F56B5000AD4B81 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 509A58F524F56B3D00AD4B81 /* XServiceLocator */; + targetProxy = 509A590824F56B5000AD4B81 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 0EADF7B521B168A000542140 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 0EADF7B621B168A000542140 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 509A58FC24F56B3D00AD4B81 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 77E79NGPCV; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = XServiceLocator/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.quickbirdstudios.XServiceLocator; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 509A58FD24F56B3D00AD4B81 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 77E79NGPCV; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = XServiceLocator/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.quickbirdstudios.XServiceLocator; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 509A590B24F56B5000AD4B81 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 77E79NGPCV; + INFOPLIST_FILE = ""; + IPHONEOS_DEPLOYMENT_TARGET = 13.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.quickbirdstudios.XServiceLocatorTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 509A590C24F56B5000AD4B81 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 77E79NGPCV; + INFOPLIST_FILE = ""; + IPHONEOS_DEPLOYMENT_TARGET = 13.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.quickbirdstudios.XServiceLocatorTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0EADF79D21B1689F00542140 /* Build configuration list for PBXProject "XServiceLocator" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0EADF7B521B168A000542140 /* Debug */, + 0EADF7B621B168A000542140 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 509A58FB24F56B3D00AD4B81 /* Build configuration list for PBXNativeTarget "XServiceLocator" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 509A58FC24F56B3D00AD4B81 /* Debug */, + 509A58FD24F56B3D00AD4B81 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 509A590A24F56B5000AD4B81 /* Build configuration list for PBXNativeTarget "XServiceLocatorTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 509A590B24F56B5000AD4B81 /* Debug */, + 509A590C24F56B5000AD4B81 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0EADF79A21B1689F00542140 /* Project object */; +} diff --git a/XServiceLocator.xcodeproj/xcshareddata/xcschemes/XServiceLocator.xcscheme b/XServiceLocator.xcodeproj/xcshareddata/xcschemes/XServiceLocator.xcscheme new file mode 100644 index 0000000..22944f7 --- /dev/null +++ b/XServiceLocator.xcodeproj/xcshareddata/xcschemes/XServiceLocator.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/XServiceLocator.xcodeproj/xcshareddata/xcschemes/XServiceLocatorTests.xcscheme b/XServiceLocator.xcodeproj/xcshareddata/xcschemes/XServiceLocatorTests.xcscheme new file mode 100644 index 0000000..3995e58 --- /dev/null +++ b/XServiceLocator.xcodeproj/xcshareddata/xcschemes/XServiceLocatorTests.xcscheme @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/XServiceLocator/Info.plist b/XServiceLocator/Info.plist new file mode 100644 index 0000000..9bcb244 --- /dev/null +++ b/XServiceLocator/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + diff --git a/XServiceLocator/XServiceLocator.h b/XServiceLocator/XServiceLocator.h new file mode 100644 index 0000000..2fa0f58 --- /dev/null +++ b/XServiceLocator/XServiceLocator.h @@ -0,0 +1,18 @@ +// +// ServiceLocator.h +// ServiceLocator +// +// Copyright Β© 2020 QuickBird Studios GmbH. All rights reserved. +// + +#import + +//! Project version number for XServiceLocator. +FOUNDATION_EXPORT double XServiceLocatorVersionNumber; + +//! Project version string for XServiceLocator. +FOUNDATION_EXPORT const unsigned char XServiceLocatorVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +