├── Cartfile ├── Cartfile.private ├── MatryoshkaPlayground ├── MatryoshkaPlayground.playground │ ├── timeline.xctimeline │ ├── contents.xcplayground │ ├── Sources │ │ └── SupportCode.swift │ └── Contents.swift ├── MatryoshkaPlaygroundTests │ ├── MatryoshkaPlaygroundTests.swift │ └── Info.plist ├── MatryoshkaPlayground │ ├── MatryoshkaPlayground.h │ ├── Networking │ │ ├── HTTPMethod.swift │ │ ├── URLOperration.swift │ │ ├── HTTPResponse.swift │ │ ├── Operations │ │ │ ├── GetUser.swift │ │ │ └── GetTrack.swift │ │ ├── HTTPRequest.swift │ │ ├── HTTPOperation.swift │ │ ├── NetworkManager.swift │ │ ├── HTTPParameterEncoding.swift │ │ └── HTTPStatusCode.swift │ ├── Extensions │ │ ├── SwiftExtensions.swift │ │ └── DecodedExtensions.swift │ ├── Info.plist │ └── Models │ │ ├── User.swift │ │ └── Track.swift ├── MatryoshkaPlayground.xcworkspace │ └── contents.xcworkspacedata └── MatryoshkaPlayground.xcodeproj │ └── project.pbxproj ├── MatryoshkaTests ├── MatryoshkaTests.swift └── Info.plist ├── Matryoshka ├── Matryoshka.h ├── Info.plist ├── OperationFactory.swift ├── Operation.swift ├── OperationFactoryType.swift └── OperationType.swift ├── Cartfile.resolved ├── .gitmodules ├── LICENSE ├── README.md └── Matryoshka.xcodeproj ├── xcshareddata └── xcschemes │ ├── Matryoshka-Mac.xcscheme │ └── Matryoshka-iOS.xcscheme └── project.pbxproj /Cartfile: -------------------------------------------------------------------------------- 1 | github "ReactiveCocoa/ReactiveCocoa" "v3.0-beta.7" 2 | -------------------------------------------------------------------------------- /Cartfile.private: -------------------------------------------------------------------------------- 1 | github "rheinfabrik/Dobby" "develop" 2 | 3 | # MatryoshkaPlayground 4 | github "thoughtbot/Argo" ~> 1.0 5 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground.playground/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /MatryoshkaTests/MatryoshkaTests.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import Foundation 4 | import XCTest 5 | 6 | class MatryoshkaTests: XCTestCase { 7 | func test() { 8 | XCTAssert(true, "Yeah") 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground.playground/Sources/SupportCode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // This file (and all other Swift source files in the Sources directory of this playground) will be precompiled into a framework which is automatically made available to MatryoshkaPlayground.playground. 3 | // 4 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlaygroundTests/MatryoshkaPlaygroundTests.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import XCTest 4 | 5 | class MatryoshkaPlaygroundTests: XCTestCase { 6 | func testExample() { 7 | XCTAssert(true, "Yeah") 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Matryoshka/Matryoshka.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | @import Foundation; 4 | 5 | //! Project version number for Matryoshka. 6 | FOUNDATION_EXPORT double MatryoshkaVersionNumber; 7 | 8 | //! Project version string for Matryoshka. 9 | FOUNDATION_EXPORT const unsigned char MatryoshkaVersionString[]; 10 | -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "robrix/Box" "1.2.2" 2 | github "Quick/Nimble" "v0.4.2" 3 | github "thoughtbot/Runes" "v2.0.0" 4 | github "antitypical/Result" "0.4.3" 5 | github "ReactiveCocoa/ReactiveCocoa" "c57928f8ccc455597bb6a5541eabef29bdd99bb3" 6 | github "thoughtbot/Argo" "v1.0.3" 7 | github "rheinfabrik/Dobby" "1f4e98f633cf5c16da179905697cab741835ef2d" 8 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/MatryoshkaPlayground.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | @import Foundation; 4 | 5 | //! Project version number for MatryoshkaPlayground. 6 | FOUNDATION_EXPORT double MatryoshkaPlaygroundVersionNumber; 7 | 8 | //! Project version string for MatryoshkaPlayground. 9 | FOUNDATION_EXPORT const unsigned char MatryoshkaPlaygroundVersionString[]; 10 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Networking/HTTPMethod.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | public enum HTTPMethod: String { 4 | case OPTIONS = "OPTIONS" 5 | case GET = "GET" 6 | case HEAD = "HEAD" 7 | case POST = "POST" 8 | case PUT = "PUT" 9 | case PATCH = "PATCH" 10 | case DELETE = "DELETE" 11 | case TRACE = "TRACE" 12 | case CONNECT = "CONNECT" 13 | } 14 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Extensions/SwiftExtensions.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | public func == (lhs: [Key: Value]?, rhs: [Key: Value]?) -> Bool { 4 | switch (lhs, rhs) { 5 | case let (.Some(lhs), .Some(rhs)): 6 | return lhs == rhs 7 | case (nil, nil): 8 | return true 9 | default: 10 | return false 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Networking/URLOperration.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import Result 4 | import ReactiveCocoa 5 | import Matryoshka 6 | 7 | public struct URLOperation: OperationType { 8 | public var URLRequest: NSURLRequest 9 | 10 | public init(URLRequest: NSURLRequest) { 11 | self.URLRequest = URLRequest 12 | } 13 | 14 | public func execute(execute: NSURLRequest -> SignalProducer<(NSData, NSURLResponse), NSError>) -> SignalProducer<(NSData, NSURLResponse), NSError> { 15 | return execute(URLRequest) 16 | } 17 | } 18 | 19 | public struct URLOperationFactory: OperationFactoryType { 20 | public func create(input: NSURLRequest) -> URLOperation.Operation { 21 | return Operation(URLOperation(URLRequest: input)) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /MatryoshkaTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | is.felixjendrusch.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Extensions/DecodedExtensions.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import Result 4 | import ReactiveCocoa 5 | import Argo 6 | 7 | public let DecodedErrorDomain = "DecodedErrorDomain" 8 | public enum DecodedErrorCode: Int { 9 | case TypeMismatch = 1 10 | case MissingKey = 2 11 | } 12 | 13 | extension Decoded { 14 | var result: Result { 15 | switch self { 16 | case let .Success(value): 17 | return .success(value.value) 18 | case .TypeMismatch(_): 19 | return .failure(NSError(domain: DecodedErrorDomain, code: DecodedErrorCode.TypeMismatch.rawValue, userInfo: nil)) 20 | case .MissingKey(_): 21 | return .failure(NSError(domain: DecodedErrorDomain, code: DecodedErrorCode.MissingKey.rawValue, userInfo: nil)) 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlaygroundTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | is.felixjendrusch.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "Carthage/Checkouts/Box"] 2 | path = Carthage/Checkouts/Box 3 | url = https://github.com/robrix/Box.git 4 | [submodule "Carthage/Checkouts/Nimble"] 5 | path = Carthage/Checkouts/Nimble 6 | url = https://github.com/Quick/Nimble.git 7 | [submodule "Carthage/Checkouts/Result"] 8 | path = Carthage/Checkouts/Result 9 | url = https://github.com/antitypical/Result.git 10 | [submodule "Carthage/Checkouts/Runes"] 11 | path = Carthage/Checkouts/Runes 12 | url = https://github.com/thoughtbot/Runes.git 13 | [submodule "Carthage/Checkouts/ReactiveCocoa"] 14 | path = Carthage/Checkouts/ReactiveCocoa 15 | url = https://github.com/ReactiveCocoa/ReactiveCocoa.git 16 | [submodule "Carthage/Checkouts/Argo"] 17 | path = Carthage/Checkouts/Argo 18 | url = https://github.com/thoughtbot/Argo.git 19 | [submodule "Carthage/Checkouts/Dobby"] 20 | path = Carthage/Checkouts/Dobby 21 | url = https://github.com/rheinfabrik/Dobby.git 22 | -------------------------------------------------------------------------------- /Matryoshka/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | is.felixjendrusch.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Matryoshka/OperationFactory.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | /// A closure-based operation factory. 4 | public struct OperationFactory: OperationFactoryType { 5 | private let createClosure: Input -> Operation 6 | 7 | /// Creates a closure-based operation factory with the given closure. 8 | public init(_ create: Input -> Operation) { 9 | createClosure = create 10 | } 11 | 12 | public func create(input: Input) -> Operation { 13 | return createClosure(input) 14 | } 15 | } 16 | 17 | extension OperationFactory { 18 | /// Creates a closure-based operation factory that wraps the given operation 19 | /// factory. 20 | public init(_ factory: F) { 21 | self.init({ input in 22 | return factory.create(input) 23 | }) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | is.felixjendrusch.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Models/User.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import Runes 4 | import Argo 5 | 6 | public struct User: Equatable { 7 | public var id: Int 8 | public var username: String 9 | 10 | public init(id: Int, username: String) { 11 | self.id = id 12 | self.username = username 13 | } 14 | } 15 | 16 | public func == (lhs: User, rhs: User) -> Bool { 17 | return lhs.id == rhs.id 18 | && lhs.username == rhs.username 19 | } 20 | 21 | extension User: Printable { 22 | public var description: String { 23 | return "User(id: \(id), username: \(username))" 24 | } 25 | } 26 | 27 | extension User: Decodable { 28 | private static func create(id: Int)(username: String) -> User { 29 | return User(id: id, username: username) 30 | } 31 | 32 | public static func decode(json: JSON) -> Decoded { 33 | return create 34 | <^> json <| "id" 35 | <*> json <| "username" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Networking/HTTPResponse.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import Foundation 4 | 5 | import Result 6 | import Argo 7 | 8 | public struct HTTPResponse: Equatable { 9 | public var statusCode: HTTPStatusCode 10 | public var data: NSData? 11 | 12 | public var json: Result { 13 | return try { error in 14 | return NSJSONSerialization.JSONObjectWithData(self.data!, options: NSJSONReadingOptions(0), error: error) 15 | }.map(JSON.parse) 16 | } 17 | 18 | public init(statusCode: HTTPStatusCode, data: NSData? = nil) { 19 | self.statusCode = statusCode 20 | self.data = data 21 | } 22 | } 23 | 24 | public func == (lhs: HTTPResponse, rhs: HTTPResponse) -> Bool { 25 | return lhs.statusCode == rhs.statusCode && lhs.data == rhs.data 26 | } 27 | 28 | extension HTTPResponse: Printable { 29 | public var description: String { 30 | return "HTTPResponse(statusCode: \(statusCode), data: \(data))" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 15 | 16 | 18 | 19 | 21 | 22 | 24 | 25 | 27 | 28 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Felix Jendrusch 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Models/Track.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import Runes 4 | import Argo 5 | 6 | public struct Track: Equatable { 7 | public var id: Int 8 | public var userId: Int 9 | public var title: String 10 | 11 | public init(id: Int, userId: Int, title: String) { 12 | self.id = id 13 | self.userId = userId 14 | self.title = title 15 | } 16 | } 17 | 18 | public func == (lhs: Track, rhs: Track) -> Bool { 19 | return lhs.id == rhs.id 20 | && lhs.userId == rhs.userId 21 | && lhs.title == rhs.title 22 | } 23 | 24 | extension Track: Printable { 25 | public var description: String { 26 | return "Track(id: \(id), userId: \(userId), title: \(title))" 27 | } 28 | } 29 | 30 | extension Track: Decodable { 31 | private static func create(id: Int)(userId: Int)(title: String) -> Track { 32 | return Track(id: id, userId: userId, title: title) 33 | } 34 | 35 | public static func decode(json: JSON) -> Decoded { 36 | return create 37 | <^> json <| "id" 38 | <*> json <| "user_id" 39 | <*> json <| "title" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Matryoshka/Operation.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import ReactiveCocoa 4 | 5 | /// A closure-based operation. 6 | public struct Operation: OperationType { 7 | private let executeClosure: (ExecuteInput -> SignalProducer) -> SignalProducer 8 | 9 | /// Creates a closure-based operation with the given closure. 10 | public init(_ execute: (ExecuteInput -> SignalProducer) -> SignalProducer) { 11 | executeClosure = execute 12 | } 13 | 14 | public func execute(execute: ExecuteInput -> SignalProducer) -> SignalProducer { 15 | return executeClosure(execute) 16 | } 17 | } 18 | 19 | extension Operation { 20 | /// Creates a closure-based operation that wraps the given operation. 21 | public init(_ operation: O) { 22 | self.init({ execute in 23 | return operation.execute(execute) 24 | }) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Networking/Operations/GetUser.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import Result 4 | import ReactiveCocoa 5 | import Argo 6 | import Matryoshka 7 | 8 | public struct GetUser: OperationType, Equatable { 9 | public var toHTTPRequest = { (id: Int) -> Result in 10 | return .success(HTTPRequest(method: .GET, path: "/users/\(id).json")) 11 | } 12 | 13 | public var toUser = { (response: HTTPResponse) -> Result in 14 | return response.json >>- { json in 15 | return User.decode(json).result 16 | } 17 | } 18 | 19 | public var id: Int 20 | 21 | public init(id: Int) { 22 | self.id = id 23 | } 24 | 25 | public func execute(execute: HTTPRequest -> SignalProducer) -> SignalProducer { 26 | return SignalProducer(value: id) 27 | |> tryMap(toHTTPRequest) 28 | |> map(execute) |> flatten(.Merge) 29 | |> tryMap(toUser) 30 | } 31 | } 32 | 33 | public func == (lhs: GetUser, rhs: GetUser) -> Bool { 34 | return lhs.id == rhs.id 35 | } 36 | 37 | public struct GetUserFactory: OperationFactoryType { 38 | public init() { 39 | 40 | } 41 | 42 | public func create(input: Int) -> GetUser.Operation { 43 | return Operation(GetUser(id: input)) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Networking/Operations/GetTrack.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import Result 4 | import ReactiveCocoa 5 | import Argo 6 | import Matryoshka 7 | 8 | public struct GetTrack: OperationType, Equatable { 9 | public var toHTTPRequest = { (id: Int) -> Result in 10 | return .success(HTTPRequest(method: .GET, path: "/tracks/\(id).json")) 11 | } 12 | 13 | public var toTrack = { (response: HTTPResponse) -> Result in 14 | return response.json >>- { json in 15 | return Track.decode(json).result 16 | } 17 | } 18 | 19 | public var id: Int 20 | 21 | public init(id: Int) { 22 | self.id = id 23 | } 24 | 25 | public func execute(execute: HTTPRequest -> SignalProducer) -> SignalProducer { 26 | return SignalProducer(value: id) 27 | |> tryMap(toHTTPRequest) 28 | |> map(execute) |> flatten(.Merge) 29 | |> tryMap(toTrack) 30 | } 31 | } 32 | 33 | public func == (lhs: GetTrack, rhs: GetTrack) -> Bool { 34 | return lhs.id == rhs.id 35 | } 36 | 37 | public struct GetTrackFactory: OperationFactoryType { 38 | public init() { 39 | 40 | } 41 | 42 | public func create(input: Int) -> GetTrack.Operation { 43 | return Operation(GetTrack(id: input)) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Networking/HTTPRequest.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import Foundation 4 | 5 | public struct HTTPRequest: Equatable { 6 | public var method: HTTPMethod 7 | public var path: String 8 | public var parameters: [String: AnyObject]? 9 | public var parameterEncoding: HTTPParameterEncoding 10 | public var headerFields: [String: String]? 11 | 12 | public init(method: HTTPMethod, path: String, parameters: [String: AnyObject]? = nil, parameterEncoding: HTTPParameterEncoding = .URL, headerFields: [String: String]? = nil) { 13 | self.method = method 14 | self.path = path 15 | self.parameters = parameters 16 | self.parameterEncoding = parameterEncoding 17 | self.headerFields = headerFields 18 | } 19 | } 20 | 21 | private func == (lhs: [String: AnyObject]?, rhs: [String: AnyObject]?) -> Bool { 22 | switch (lhs, rhs) { 23 | case let (.Some(lhs), .Some(rhs)): 24 | return (lhs as NSDictionary).isEqual(rhs as NSDictionary) 25 | case (nil, nil): 26 | return true 27 | default: 28 | return false 29 | } 30 | } 31 | 32 | public func == (lhs: HTTPRequest, rhs: HTTPRequest) -> Bool { 33 | return lhs.method == rhs.method 34 | && lhs.path == rhs.path 35 | && lhs.parameters == rhs.parameters 36 | && lhs.parameterEncoding == rhs.parameterEncoding 37 | && lhs.headerFields == rhs.headerFields 38 | } 39 | 40 | extension HTTPRequest: Printable { 41 | public var description: String { 42 | return "HTTPRequest(method: \(method), path: \(path), parameters: \(parameters), parameterEncoding: \(parameterEncoding), headerFields: \(headerFields))" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Matryoshka/OperationFactoryType.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import ReactiveCocoa 4 | 5 | /// An operation factory type that creates operations for a specific input type. 6 | public protocol OperationFactoryType { 7 | typealias InputType 8 | typealias OperationType: Matryoshka.OperationType 9 | 10 | typealias OperationFactory = Matryoshka.OperationFactory 11 | 12 | /// Creates an operation for the given input value. 13 | func create(input: InputType) -> OperationType 14 | } 15 | 16 | // MARK: - Basics 17 | 18 | /// OperationFactoryType.create() as a free function. 19 | public func create(factory: F) -> F.InputType -> F.OperationType { 20 | return { input in 21 | return factory.create(input) 22 | } 23 | } 24 | 25 | // MARK: - Transformer 26 | 27 | /// Maps an input value to an operation which is performed with the given 28 | /// execution function. 29 | public func perform(factory: F, execute: F.OperationType.ExecuteInputType -> SignalProducer) -> F.InputType -> SignalProducer { 30 | return { input in 31 | return factory.create(input).execute(execute) 32 | } 33 | } 34 | 35 | // MARK: - Operator 36 | 37 | /// Maps each input value to an operation which is performed with the given 38 | /// execution function, then flattens the resulting producers (into a single 39 | /// producer of values), according to the semantics of the given strategy. 40 | /// 41 | /// Equivalent to: `flatMap(strategy, perform(factory, execute))`. 42 | public func perform(strategy: FlattenStrategy, factory: F, execute: F.OperationType.ExecuteInputType -> SignalProducer) -> SignalProducer -> SignalProducer { 43 | return { producer in 44 | return producer |> map(perform(factory, execute)) |> flatten(strategy) 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Networking/HTTPOperation.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import Result 4 | import ReactiveCocoa 5 | import Matryoshka 6 | 7 | public let HTTPOperationErrorDomain = "HTTPOperationErrorDomain" 8 | public enum HTTPOperationErrorCode: Int { 9 | case InvalidResponse = 1 10 | } 11 | 12 | public struct HTTPOperation: OperationType { 13 | public var toURLRequest = { (baseURL: NSURL, request: HTTPRequest) -> Result in 14 | var mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: request.path, relativeToURL: baseURL)!) 15 | mutableURLRequest.HTTPMethod = request.method.rawValue 16 | mutableURLRequest.allHTTPHeaderFields = request.headerFields 17 | 18 | let (URLRequest, error) = request.parameterEncoding.encode(mutableURLRequest, parameters: request.parameters) 19 | if let error = error { 20 | return .failure(error) 21 | } 22 | 23 | return .success(URLRequest) 24 | } 25 | 26 | public var toHTTPResponse = { (data: NSData, response: NSURLResponse) -> Result in 27 | let error = { NSError(domain: HTTPOperationErrorDomain, code: HTTPOperationErrorCode.InvalidResponse.rawValue, userInfo: nil) } 28 | return Result((response as? NSHTTPURLResponse)?.statusCode, failWith: error()).map { statusCode in 29 | return HTTPResponse(statusCode: HTTPStatusCode(rawValue: statusCode), data: data) 30 | } 31 | } 32 | 33 | public var baseURL: NSURL 34 | public var request: HTTPRequest 35 | 36 | public init(baseURL: NSURL, request: HTTPRequest) { 37 | self.baseURL = baseURL 38 | self.request = request 39 | } 40 | 41 | public func execute(execute: NSURLRequest -> SignalProducer<(NSData, NSURLResponse), NSError>) -> SignalProducer { 42 | return SignalProducer(value: (baseURL: baseURL, request: request)) 43 | |> tryMap(toURLRequest) 44 | |> map(execute) |> flatten(.Merge) 45 | |> tryMap(toHTTPResponse) 46 | } 47 | } 48 | 49 | public struct HTTPOperationFactory: OperationFactoryType { 50 | public func create(input: (baseURL: NSURL, request: HTTPRequest)) -> HTTPOperation.Operation { 51 | return Operation(HTTPOperation(baseURL: input.baseURL, request: input.request)) 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Matryoshka/OperationType.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import ReactiveCocoa 4 | 5 | /// An operation type that delegates the execution of its task to a function. 6 | public protocol OperationType { 7 | typealias ExecuteInputType 8 | typealias ExecuteOutputType 9 | typealias ExecuteErrorType: ReactiveCocoa.ErrorType 10 | 11 | typealias OutputType 12 | typealias ErrorType: ReactiveCocoa.ErrorType 13 | 14 | typealias Operation = Matryoshka.Operation 15 | 16 | /// Creates a SignalProducer that, when started, will execute the task using 17 | /// the given function, then forward the results upon the produced Signal. 18 | func execute(execute: ExecuteInputType -> SignalProducer) -> SignalProducer 19 | } 20 | 21 | // MARK: - Basics 22 | 23 | /// OperationType.execute() as a free function. 24 | public func execute(operation: O) -> (O.ExecuteInputType -> SignalProducer) -> SignalProducer { 25 | return { execute in 26 | return operation.execute(execute) 27 | } 28 | } 29 | 30 | // MARK: - Transformer 31 | 32 | /// Maps an input value to an operation which is performed with the given 33 | /// execution function. 34 | public func perform(create: T -> O, execute: O.ExecuteInputType -> SignalProducer) -> T -> SignalProducer { 35 | return { input in 36 | return create(input).execute(execute) 37 | } 38 | } 39 | 40 | // MARK: - Operator 41 | 42 | /// Maps each input value to an operation which is performed with the given 43 | /// execution function, then flattens the resulting producers (into a single 44 | /// producer of values), according to the semantics of the given strategy. 45 | /// 46 | /// Equivalent to: `flatMap(strategy, perform(create, execute))`. 47 | public func perform(strategy: FlattenStrategy, create: T -> O, execute: O.ExecuteInputType -> SignalProducer) -> SignalProducer -> SignalProducer { 48 | return { producer in 49 | return producer |> map(perform(create, execute)) |> flatten(strategy) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground.playground/Contents.swift: -------------------------------------------------------------------------------- 1 | import XCPlayground 2 | 3 | // Continue playground execution indefinitely because we are going to perform 4 | // some real network requests. 5 | XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true) 6 | 7 | import Dobby 8 | import Result 9 | import ReactiveCocoa 10 | import Matryoshka 11 | import MatryoshkaPlayground 12 | 13 | // Create a stub for HTTP requests. 14 | let HTTPOperationStub = Stub, SignalProducer>() 15 | 16 | // Create an operation mock for HTTP requests. Unless the stub defines behavior 17 | // for a specific request, the execution will be forwarded. 18 | struct HTTPOperationMock: OperationType { 19 | let operation: HTTPOperation 20 | 21 | init(baseURL: NSURL, request: HTTPRequest) { 22 | operation = HTTPOperation(baseURL: baseURL, request: request) 23 | } 24 | 25 | func execute(execute: NSURLRequest -> SignalProducer<(NSData, NSURLResponse), NSError>) -> SignalProducer { 26 | return invoke(HTTPOperationStub, interaction(value(operation.request))) ?? operation.execute(execute) 27 | } 28 | } 29 | 30 | var configuration = NetworkManager.Configuration() 31 | // Switch from HTTPS (default) to HTTP. 32 | configuration.baseURL = NSURL(string: "http://api.soundcloud.com")! 33 | // Create an operation factory for our HTTP operation mock. 34 | configuration.HTTPOperationFactory = OperationFactory { input in 35 | return Operation(HTTPOperationMock(baseURL: input.baseURL, request: input.request)) 36 | } 37 | 38 | let networkManager = NetworkManager(configuration: configuration) 39 | 40 | // Get the track with id 177965394, then the user that uploaded it. 41 | let real = GetTrack(id: 177965394).execute(networkManager.execute) 42 | |> map { track in track.userId } 43 | |> perform(.Merge, GetUserFactory(), networkManager.execute) 44 | |> first 45 | 46 | // Oh yeah, that was me. 47 | real?.value?.username 48 | 49 | let data = "{ \"id\": -1, \"username\": \"nobody\" }".dataUsingEncoding(NSUTF8StringEncoding) 50 | // Stub any future HTTP requests that tries to load the same user again and 51 | // return a fake user instead. 52 | behave(HTTPOperationStub, interaction(filter { request in 53 | return startsWith(request.path, "/users/\(real!.value!.id)") 54 | }), SignalProducer(value: HTTPResponse(statusCode: .OK, data: data))) 55 | 56 | // Again, get the track with id 177965394, then the user that uploaded it. 57 | let fake = GetTrack(id: 177965394).execute(networkManager.execute) 58 | |> map { track in track.userId } 59 | |> perform(.Merge, GetUserFactory(), networkManager.execute) 60 | |> first 61 | 62 | // Call me maybe. 63 | fake?.value?.username 64 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Networking/NetworkManager.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015 Felix Jendrusch. All rights reserved. 2 | 3 | import Foundation 4 | 5 | import Result 6 | import ReactiveCocoa 7 | import Argo 8 | import Matryoshka 9 | 10 | public let NetworkManagerErrorDomain = "NetworkManagerErrorDomain" 11 | public enum NetworkManagerErrorCode: Int { 12 | case InvalidResponse = 1 13 | } 14 | 15 | public class NetworkManager { 16 | public struct Configuration { 17 | public struct Credentials { 18 | public var id: String = "a4ad8d73d0bd0c04008d88b35e78fbce" 19 | public var secret: String? 20 | 21 | public init(id: String? = nil, secret: String? = nil) { 22 | if let id = id { 23 | self.id = id 24 | } 25 | 26 | self.secret = secret 27 | } 28 | } 29 | 30 | public var baseURL = NSURL(string: "https://api.soundcloud.com")! 31 | public var URLSession = NSURLSession.sharedSession() 32 | public var URLOperationFactory = OperationFactory(MatryoshkaPlayground.URLOperationFactory()) 33 | public var HTTPOperationFactory = OperationFactory(MatryoshkaPlayground.HTTPOperationFactory()) 34 | 35 | public var credentials: Credentials 36 | 37 | public init(credentials: Credentials = Credentials()) { 38 | self.credentials = credentials 39 | } 40 | } 41 | 42 | public let configuration: Configuration 43 | 44 | public init(configuration: Configuration = Configuration()) { 45 | self.configuration = configuration 46 | } 47 | 48 | public func execute(request: HTTPRequest) -> SignalProducer { 49 | return SignalProducer(value: (baseURL: configuration.baseURL, request: request)) 50 | |> map { (baseURL, var request) in 51 | var parameters = request.parameters ?? [:] 52 | parameters["client_id"] = self.configuration.credentials.id 53 | parameters["client_secret"] = self.configuration.credentials.secret 54 | request.parameters = parameters 55 | return (baseURL, request) 56 | } 57 | |> perform(.Merge, configuration.HTTPOperationFactory) { request in 58 | return SignalProducer(value: request) 59 | |> perform(.Merge, self.configuration.URLOperationFactory, self.configuration.URLSession.rac_dataWithRequest) 60 | } 61 | |> tryMap { response in 62 | let error = { NSError(domain: NetworkManagerErrorDomain, code: NetworkManagerErrorCode.InvalidResponse.rawValue, userInfo: nil) } 63 | return Result(response.statusCode == .OK ? response : nil, failWith: error()) 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Matryoshka 2 | 3 | > A matryoshka doll, also known as Russian nesting doll or Russian doll, refers to a set of wooden dolls of decreasing size placed one inside the other. — [Wikipedia](http://en.wikipedia.org/wiki/Matryoshka_doll) 4 | 5 | ## Introduction 6 | 7 | Matryoshka is more of an architectural approach and structural help than an actual framework. It is fundamentally build around the idea of creating a [`SignalProducer`](https://github.com/ReactiveCocoa/ReactiveCocoa/blob/swift-development/ReactiveCocoa/Swift/SignalProducer.swift) that, when started, will execute a task with a given input, then forward the results upon the produced [`Signal`](https://github.com/ReactiveCocoa/ReactiveCocoa/blob/swift-development/ReactiveCocoa/Swift/Signal.swift). This can be represented as a function: 8 | 9 | ```swift 10 | Input -> SignalProducer 11 | ``` 12 | 13 | Very often, a task can be divided into subtasks or transformed into another task, enabling delegation of its actual execution to another function of similar signature. Again, this can be represented as a function: 14 | 15 | ```swift 16 | Input -> (ExecuteInput -> SignalProducer) -> SignalProducer 17 | ``` 18 | 19 | Splitting up the execution of a task into multiple such functions can have several benefits, including greater *reusability*, *composability* and *testability*. 20 | 21 | Matryoshka provides a few very basic types and functions that help separating the initialization and execution of such operations. It also provides some handy signal producer operators and transformers that ease chaining and nesting. 22 | 23 | ## Documentation 24 | 25 | Please take a look at the code, it ain't much anyways 😉 26 | 27 | ## Playground 28 | 29 | There is a [playground](https://github.com/felixjendrusch/Matryoshka/blob/master/MatryoshkaPlayground/MatryoshkaPlayground.playground/Contents.swift) and an accompanying [project](https://github.com/felixjendrusch/Matryoshka/tree/master/MatryoshkaPlayground) that implements a network layer and a few operations of the official [SoundCloud API](https://developers.soundcloud.com). It's very basic, just have a look 😅 30 | 31 | ## Integration 32 | 33 | ### Carthage 34 | 35 | [Carthage](https://github.com/Carthage/Carthage) is a simple, decentralized dependency manager for Cocoa. 36 | 37 | 1. Add Matryoshka to your [Cartfile](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile): 38 | 39 | ``` 40 | github "felixjendrusch/Matryoshka" ~> 0.1 41 | ``` 42 | 43 | 2. Run `carthage update` to fetch and build Matryoshka and its dependencies. 44 | 45 | 3. [Make sure your application's target links against `Matryoshka.framework` and copies all relevant frameworks into its application bundle (iOS); or embeds the binaries of all relevant frameworks (Mac).](https://github.com/carthage/carthage#getting-started) 46 | -------------------------------------------------------------------------------- /Matryoshka.xcodeproj/xcshareddata/xcschemes/Matryoshka-Mac.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /Matryoshka.xcodeproj/xcshareddata/xcschemes/Matryoshka-iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Networking/HTTPParameterEncoding.swift: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | // 10 | // The above copyright notice and this permission notice shall be included in 11 | // all copies or substantial portions of the Software. 12 | // 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | // THE SOFTWARE. 20 | 21 | import Foundation 22 | 23 | /** 24 | Used to specify the way in which a set of parameters are applied to a URL request. 25 | */ 26 | public enum HTTPParameterEncoding: Equatable { 27 | /** 28 | A query string to be set as or appended to any existing URL query for `GET`, `HEAD`, and `DELETE` requests, or set as the body for requests with any other HTTP method. The `Content-Type` HTTP header field of an encoded request with HTTP body is set to `application/x-www-form-urlencoded`. Since there is no published specification for how to encode collection types, the convention of appending `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for nested dictionary values (`foo[bar]=baz`). 29 | */ 30 | case URL 31 | 32 | /** 33 | Uses `NSJSONSerialization` to create a JSON representation of the parameters object, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`. 34 | */ 35 | case JSON 36 | 37 | /** 38 | Uses `NSPropertyListSerialization` to create a plist representation of the parameters object, according to the associated format and write options values, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/x-plist`. 39 | */ 40 | case PropertyList(NSPropertyListFormat, NSPropertyListWriteOptions) 41 | 42 | /** 43 | Creates a URL request by encoding parameters and applying them onto an existing request. 44 | :param: URLRequest The request to have parameters applied 45 | :param: parameters The parameters to apply 46 | :returns: A tuple containing the constructed request and the error that occurred during parameter encoding, if any. 47 | */ 48 | public func encode(URLRequest: NSURLRequest, parameters: [String: AnyObject]?) -> (NSURLRequest, NSError?) { 49 | if parameters == nil { 50 | return (URLRequest, nil) 51 | } 52 | 53 | var mutableURLRequest: NSMutableURLRequest! = URLRequest.mutableCopy() as! NSMutableURLRequest 54 | var error: NSError? = nil 55 | 56 | switch self { 57 | case .URL: 58 | func query(parameters: [String: AnyObject]) -> String { 59 | var components: [(String, String)] = [] 60 | for key in sorted(Array(parameters.keys), <) { 61 | let value: AnyObject! = parameters[key] 62 | components += self.queryComponents(key, value) 63 | } 64 | 65 | return join("&", components.map{"\($0)=\($1)"} as [String]) 66 | } 67 | 68 | func encodesParametersInURL(method: HTTPMethod) -> Bool { 69 | switch method { 70 | case .GET, .HEAD, .DELETE: 71 | return true 72 | default: 73 | return false 74 | } 75 | } 76 | 77 | let method = HTTPMethod(rawValue: mutableURLRequest.HTTPMethod) 78 | if method != nil && encodesParametersInURL(method!) { 79 | if let URLComponents = NSURLComponents(URL: mutableURLRequest.URL!, resolvingAgainstBaseURL: false) { 80 | URLComponents.percentEncodedQuery = (URLComponents.percentEncodedQuery != nil ? URLComponents.percentEncodedQuery! + "&" : "") + query(parameters!) 81 | mutableURLRequest.URL = URLComponents.URL 82 | } 83 | } else { 84 | if mutableURLRequest.valueForHTTPHeaderField("Content-Type") == nil { 85 | mutableURLRequest.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 86 | } 87 | 88 | mutableURLRequest.HTTPBody = query(parameters!).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 89 | } 90 | case .JSON: 91 | let options = NSJSONWritingOptions.allZeros 92 | if let data = NSJSONSerialization.dataWithJSONObject(parameters!, options: options, error: &error) { 93 | mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") 94 | mutableURLRequest.HTTPBody = data 95 | } 96 | case .PropertyList(let (format, options)): 97 | if let data = NSPropertyListSerialization.dataWithPropertyList(parameters!, format: format, options: options, error: &error) { 98 | mutableURLRequest.setValue("application/x-plist", forHTTPHeaderField: "Content-Type") 99 | mutableURLRequest.HTTPBody = data 100 | } 101 | } 102 | 103 | return (mutableURLRequest, error) 104 | } 105 | 106 | func queryComponents(key: String, _ value: AnyObject) -> [(String, String)] { 107 | var components: [(String, String)] = [] 108 | if let dictionary = value as? [String: AnyObject] { 109 | for (nestedKey, value) in dictionary { 110 | components += queryComponents("\(key)[\(nestedKey)]", value) 111 | } 112 | } else if let array = value as? [AnyObject] { 113 | for value in array { 114 | components += queryComponents("\(key)[]", value) 115 | } 116 | } else { 117 | components.extend([(escape(key), escape("\(value)"))]) 118 | } 119 | 120 | return components 121 | } 122 | 123 | func escape(string: String) -> String { 124 | let legalURLCharactersToBeEscaped: CFStringRef = ":&=;+!@#$()',*" 125 | return CFURLCreateStringByAddingPercentEscapes(nil, string, nil, legalURLCharactersToBeEscaped, CFStringBuiltInEncodings.UTF8.rawValue) as String 126 | } 127 | } 128 | 129 | private func == (lhs: [String: AnyObject]?, rhs: [String: AnyObject]?) -> Bool { 130 | switch (lhs, rhs) { 131 | case let (.Some(lhs), .Some(rhs)): 132 | return (lhs as NSDictionary).isEqual(rhs as NSDictionary) 133 | case (nil, nil): 134 | return true 135 | default: 136 | return false 137 | } 138 | } 139 | 140 | public func == (lhs: HTTPParameterEncoding, rhs: HTTPParameterEncoding) -> Bool { 141 | switch (lhs, rhs) { 142 | case (.URL, .URL): 143 | return true 144 | case (.JSON, .JSON): 145 | return true 146 | case let (.PropertyList(format1, writeOptions1), .PropertyList(format2, writeOptions2)): 147 | return format1 == format2 && writeOptions1 == writeOptions2 148 | default: 149 | return false 150 | } 151 | } 152 | 153 | extension HTTPParameterEncoding: Printable { 154 | public var description: String { 155 | switch self { 156 | case .URL: 157 | return "URL" 158 | case .JSON: 159 | return "JSON" 160 | case let .PropertyList(format, writeOptions): 161 | return "PropertyList(format: \(format), writeOptions: \(writeOptions))" 162 | } 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground/Networking/HTTPStatusCode.swift: -------------------------------------------------------------------------------- 1 | // http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml 2 | public enum HTTPStatusCode: Equatable { 3 | // Informational 4 | case Continue 5 | case SwitchingProtocols 6 | case Processing 7 | 8 | // Success 9 | case OK 10 | case Created 11 | case Accepted 12 | case NonAuthoritativeInformation 13 | case NoContent 14 | case ResetContent 15 | case PartialContent 16 | case MultiStatus 17 | case AlreadyReported 18 | case IMUsed 19 | 20 | // Redirection 21 | case MultipleChoices 22 | case MovedPermanently 23 | case Found 24 | case SeeOther 25 | case NotModified 26 | case UseProxy 27 | case TemporaryRedirect 28 | case PermanentRedirect 29 | 30 | // Client Error 31 | case BadRequest 32 | case Unauthorized 33 | case PaymentRequired 34 | case Forbidden 35 | case NotFound 36 | case MethodNotAllowed 37 | case NotAcceptable 38 | case ProxyAuthenticationRequired 39 | case RequestTimeout 40 | case Conflict 41 | case Gone 42 | case LengthRequired 43 | case PreconditionFailed 44 | case PayloadTooLarge 45 | case URITooLong 46 | case UnsupportedMediaType 47 | case RangeNotSatisfiable 48 | case ExceptionFailed 49 | case MisdirectedRequest 50 | case UnprocessableEntity 51 | case Locked 52 | case FailedDependency 53 | case UpgradeRequired 54 | case PreconditionRequired 55 | case TooManyRequests 56 | case RequestHeaderFieldsTooLarge 57 | 58 | // Server Error 59 | case InternalServerError 60 | case NotImplemented 61 | case BadGateway 62 | case ServiceUnavailable 63 | case GatewayTimeout 64 | case HTTPVersionNotSupported 65 | case VariantAlsoNegotiates 66 | case InsufficientStorage 67 | case LoopDetected 68 | case NotExtended 69 | case NetworkAuthenticationRequired 70 | 71 | // Unknown 72 | case Unknown(Int) 73 | } 74 | 75 | public func == (lhs: HTTPStatusCode, rhs: HTTPStatusCode) -> Bool { 76 | return lhs.rawValue == rhs.rawValue 77 | } 78 | 79 | extension HTTPStatusCode: Printable { 80 | public var description: String { 81 | return String(rawValue) 82 | } 83 | } 84 | 85 | extension HTTPStatusCode: RawRepresentable { 86 | public var rawValue: Int { 87 | switch self { 88 | case .Continue: 89 | return 100 90 | case .SwitchingProtocols: 91 | return 101 92 | case .Processing: 93 | return 102 94 | case .OK: 95 | return 200 96 | case .Created: 97 | return 201 98 | case .Accepted: 99 | return 202 100 | case .NonAuthoritativeInformation: 101 | return 203 102 | case .NoContent: 103 | return 204 104 | case .ResetContent: 105 | return 205 106 | case .PartialContent: 107 | return 206 108 | case .MultiStatus: 109 | return 207 110 | case .AlreadyReported: 111 | return 208 112 | case .IMUsed: 113 | return 226 114 | case .MultipleChoices: 115 | return 300 116 | case .MovedPermanently: 117 | return 301 118 | case .Found: 119 | return 302 120 | case .SeeOther: 121 | return 303 122 | case .NotModified: 123 | return 304 124 | case .UseProxy: 125 | return 305 126 | case .TemporaryRedirect: 127 | return 307 128 | case .PermanentRedirect: 129 | return 308 130 | case .BadRequest: 131 | return 400 132 | case .Unauthorized: 133 | return 401 134 | case .PaymentRequired: 135 | return 402 136 | case .Forbidden: 137 | return 403 138 | case .NotFound: 139 | return 404 140 | case .MethodNotAllowed: 141 | return 405 142 | case .NotAcceptable: 143 | return 406 144 | case .ProxyAuthenticationRequired: 145 | return 407 146 | case .RequestTimeout: 147 | return 408 148 | case .Conflict: 149 | return 409 150 | case .Gone: 151 | return 410 152 | case .LengthRequired: 153 | return 411 154 | case .PreconditionFailed: 155 | return 412 156 | case .PayloadTooLarge: 157 | return 413 158 | case .URITooLong: 159 | return 414 160 | case .UnsupportedMediaType: 161 | return 415 162 | case .RangeNotSatisfiable: 163 | return 416 164 | case .ExceptionFailed: 165 | return 417 166 | case .MisdirectedRequest: 167 | return 421 168 | case .UnprocessableEntity: 169 | return 422 170 | case .Locked: 171 | return 423 172 | case .FailedDependency: 173 | return 424 174 | case .UpgradeRequired: 175 | return 426 176 | case .PreconditionRequired: 177 | return 428 178 | case .TooManyRequests: 179 | return 429 180 | case .RequestHeaderFieldsTooLarge: 181 | return 431 182 | case .InternalServerError: 183 | return 500 184 | case .NotImplemented: 185 | return 501 186 | case .BadGateway: 187 | return 502 188 | case .ServiceUnavailable: 189 | return 503 190 | case .GatewayTimeout: 191 | return 504 192 | case .HTTPVersionNotSupported: 193 | return 505 194 | case .VariantAlsoNegotiates: 195 | return 506 196 | case .InsufficientStorage: 197 | return 507 198 | case .LoopDetected: 199 | return 508 200 | case .NotExtended: 201 | return 510 202 | case .NetworkAuthenticationRequired: 203 | return 511 204 | case let .Unknown(statusCode): 205 | return statusCode 206 | } 207 | } 208 | 209 | public init(rawValue: Int) { 210 | switch rawValue { 211 | case 100: 212 | self = .Continue 213 | case 101: 214 | self = .SwitchingProtocols 215 | case 102: 216 | self = .Processing 217 | case 200: 218 | self = .OK 219 | case 201: 220 | self = .Created 221 | case 202: 222 | self = .Accepted 223 | case 203: 224 | self = .NonAuthoritativeInformation 225 | case 204: 226 | self = .NoContent 227 | case 205: 228 | self = .ResetContent 229 | case 206: 230 | self = .PartialContent 231 | case 207: 232 | self = .MultiStatus 233 | case 208: 234 | self = .AlreadyReported 235 | case 226: 236 | self = .IMUsed 237 | case 300: 238 | self = .MultipleChoices 239 | case 301: 240 | self = .MovedPermanently 241 | case 302: 242 | self = .Found 243 | case 303: 244 | self = .SeeOther 245 | case 304: 246 | self = .NotModified 247 | case 305: 248 | self = .UseProxy 249 | case 307: 250 | self = .TemporaryRedirect 251 | case 308: 252 | self = .PermanentRedirect 253 | case 400: 254 | self = .BadRequest 255 | case 401: 256 | self = .Unauthorized 257 | case 402: 258 | self = .PaymentRequired 259 | case 403: 260 | self = .Forbidden 261 | case 404: 262 | self = .NotFound 263 | case 405: 264 | self = .MethodNotAllowed 265 | case 406: 266 | self = .NotAcceptable 267 | case 407: 268 | self = .ProxyAuthenticationRequired 269 | case 408: 270 | self = .RequestTimeout 271 | case 409: 272 | self = .Conflict 273 | case 410: 274 | self = .Gone 275 | case 411: 276 | self = .LengthRequired 277 | case 412: 278 | self = .PreconditionFailed 279 | case 413: 280 | self = .PayloadTooLarge 281 | case 414: 282 | self = .URITooLong 283 | case 415: 284 | self = .UnsupportedMediaType 285 | case 416: 286 | self = .RangeNotSatisfiable 287 | case 417: 288 | self = .ExceptionFailed 289 | case 421: 290 | self = .MisdirectedRequest 291 | case 422: 292 | self = .UnprocessableEntity 293 | case 423: 294 | self = .Locked 295 | case 424: 296 | self = .FailedDependency 297 | case 426: 298 | self = .UpgradeRequired 299 | case 428: 300 | self = .PreconditionRequired 301 | case 429: 302 | self = .TooManyRequests 303 | case 431: 304 | self = .RequestHeaderFieldsTooLarge 305 | case 500: 306 | self = .InternalServerError 307 | case 501: 308 | self = .NotImplemented 309 | case 502: 310 | self = .BadGateway 311 | case 503: 312 | self = .ServiceUnavailable 313 | case 504: 314 | self = .GatewayTimeout 315 | case 505: 316 | self = .HTTPVersionNotSupported 317 | case 506: 318 | self = .VariantAlsoNegotiates 319 | case 507: 320 | self = .InsufficientStorage 321 | case 508: 322 | self = .LoopDetected 323 | case 510: 324 | self = .NotExtended 325 | case 511: 326 | self = .NetworkAuthenticationRequired 327 | case let statusCode: 328 | self = .Unknown(statusCode) 329 | } 330 | } 331 | } 332 | -------------------------------------------------------------------------------- /MatryoshkaPlayground/MatryoshkaPlayground.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | DCB2DC1E1B0D20A9002838A8 /* MatryoshkaPlayground.h in Headers */ = {isa = PBXBuildFile; fileRef = DCB2DC1D1B0D20A9002838A8 /* MatryoshkaPlayground.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | DCB2DC241B0D20A9002838A8 /* MatryoshkaPlayground.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCB2DC181B0D20A9002838A8 /* MatryoshkaPlayground.framework */; }; 12 | DCB2DC2B1B0D20A9002838A8 /* MatryoshkaPlaygroundTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC2A1B0D20A9002838A8 /* MatryoshkaPlaygroundTests.swift */; }; 13 | DCB2DC461B0D2127002838A8 /* DecodedExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC351B0D2127002838A8 /* DecodedExtensions.swift */; }; 14 | DCB2DC471B0D2127002838A8 /* SwiftExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC361B0D2127002838A8 /* SwiftExtensions.swift */; }; 15 | DCB2DC481B0D2127002838A8 /* Track.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC381B0D2127002838A8 /* Track.swift */; }; 16 | DCB2DC491B0D2127002838A8 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC391B0D2127002838A8 /* User.swift */; }; 17 | DCB2DC4A1B0D2127002838A8 /* HTTPMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC3B1B0D2127002838A8 /* HTTPMethod.swift */; }; 18 | DCB2DC4B1B0D2127002838A8 /* HTTPOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC3C1B0D2127002838A8 /* HTTPOperation.swift */; }; 19 | DCB2DC4C1B0D2127002838A8 /* HTTPParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC3D1B0D2127002838A8 /* HTTPParameterEncoding.swift */; }; 20 | DCB2DC4D1B0D2127002838A8 /* HTTPRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC3E1B0D2127002838A8 /* HTTPRequest.swift */; }; 21 | DCB2DC4E1B0D2127002838A8 /* HTTPResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC3F1B0D2127002838A8 /* HTTPResponse.swift */; }; 22 | DCB2DC4F1B0D2127002838A8 /* HTTPStatusCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC401B0D2127002838A8 /* HTTPStatusCode.swift */; }; 23 | DCB2DC501B0D2127002838A8 /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC411B0D2127002838A8 /* NetworkManager.swift */; }; 24 | DCB2DC531B0D2127002838A8 /* URLOperration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC451B0D2127002838A8 /* URLOperration.swift */; }; 25 | DCB2DC591B0D216D002838A8 /* Argo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCB2DC541B0D216D002838A8 /* Argo.framework */; }; 26 | DCB2DC5A1B0D216D002838A8 /* Matryoshka.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCB2DC551B0D216D002838A8 /* Matryoshka.framework */; }; 27 | DCB2DC5B1B0D216D002838A8 /* ReactiveCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCB2DC561B0D216D002838A8 /* ReactiveCocoa.framework */; }; 28 | DCB2DC5C1B0D216D002838A8 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCB2DC571B0D216D002838A8 /* Result.framework */; }; 29 | DCB2DC5D1B0D216D002838A8 /* Runes.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCB2DC581B0D216D002838A8 /* Runes.framework */; }; 30 | DCB2DC6E1B0D24D9002838A8 /* GetTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC6C1B0D24D9002838A8 /* GetTrack.swift */; }; 31 | DCB2DC6F1B0D24D9002838A8 /* GetUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB2DC6D1B0D24D9002838A8 /* GetUser.swift */; }; 32 | DCB2DC711B0D2912002838A8 /* Dobby.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCB2DC701B0D2912002838A8 /* Dobby.framework */; }; 33 | /* End PBXBuildFile section */ 34 | 35 | /* Begin PBXContainerItemProxy section */ 36 | DCB2DC251B0D20A9002838A8 /* PBXContainerItemProxy */ = { 37 | isa = PBXContainerItemProxy; 38 | containerPortal = DCB2DC0F1B0D20A9002838A8 /* Project object */; 39 | proxyType = 1; 40 | remoteGlobalIDString = DCB2DC171B0D20A9002838A8; 41 | remoteInfo = MatryoshkaPlayground; 42 | }; 43 | /* End PBXContainerItemProxy section */ 44 | 45 | /* Begin PBXFileReference section */ 46 | DCB2DC181B0D20A9002838A8 /* MatryoshkaPlayground.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MatryoshkaPlayground.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 47 | DCB2DC1C1B0D20A9002838A8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 48 | DCB2DC1D1B0D20A9002838A8 /* MatryoshkaPlayground.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MatryoshkaPlayground.h; sourceTree = ""; }; 49 | DCB2DC231B0D20A9002838A8 /* MatryoshkaPlaygroundTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MatryoshkaPlaygroundTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 50 | DCB2DC291B0D20A9002838A8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 51 | DCB2DC2A1B0D20A9002838A8 /* MatryoshkaPlaygroundTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatryoshkaPlaygroundTests.swift; sourceTree = ""; }; 52 | DCB2DC351B0D2127002838A8 /* DecodedExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DecodedExtensions.swift; sourceTree = ""; }; 53 | DCB2DC361B0D2127002838A8 /* SwiftExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftExtensions.swift; sourceTree = ""; }; 54 | DCB2DC381B0D2127002838A8 /* Track.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Track.swift; sourceTree = ""; }; 55 | DCB2DC391B0D2127002838A8 /* User.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = ""; }; 56 | DCB2DC3B1B0D2127002838A8 /* HTTPMethod.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPMethod.swift; sourceTree = ""; }; 57 | DCB2DC3C1B0D2127002838A8 /* HTTPOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPOperation.swift; sourceTree = ""; }; 58 | DCB2DC3D1B0D2127002838A8 /* HTTPParameterEncoding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPParameterEncoding.swift; sourceTree = ""; }; 59 | DCB2DC3E1B0D2127002838A8 /* HTTPRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPRequest.swift; sourceTree = ""; }; 60 | DCB2DC3F1B0D2127002838A8 /* HTTPResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPResponse.swift; sourceTree = ""; }; 61 | DCB2DC401B0D2127002838A8 /* HTTPStatusCode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPStatusCode.swift; sourceTree = ""; }; 62 | DCB2DC411B0D2127002838A8 /* NetworkManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = ""; }; 63 | DCB2DC451B0D2127002838A8 /* URLOperration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLOperration.swift; sourceTree = ""; }; 64 | DCB2DC541B0D216D002838A8 /* Argo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Argo.framework; path = "../Carthage/Checkouts/Argo/build/Debug-iphoneos/Argo.framework"; sourceTree = ""; }; 65 | DCB2DC551B0D216D002838A8 /* Matryoshka.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Matryoshka.framework; path = "../build/Debug-iphoneos/Matryoshka.framework"; sourceTree = ""; }; 66 | DCB2DC561B0D216D002838A8 /* ReactiveCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveCocoa.framework; path = "../Carthage/Checkouts/ReactiveCocoa/build/Debug-iphoneos/ReactiveCocoa.framework"; sourceTree = ""; }; 67 | DCB2DC571B0D216D002838A8 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Result.framework; path = "../Carthage/Checkouts/Result/build/Debug-iphoneos/Result.framework"; sourceTree = ""; }; 68 | DCB2DC581B0D216D002838A8 /* Runes.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Runes.framework; path = "../Carthage/Checkouts/runes/build/Debug-iphoneos/Runes.framework"; sourceTree = ""; }; 69 | DCB2DC6C1B0D24D9002838A8 /* GetTrack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetTrack.swift; sourceTree = ""; }; 70 | DCB2DC6D1B0D24D9002838A8 /* GetUser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetUser.swift; sourceTree = ""; }; 71 | DCB2DC701B0D2912002838A8 /* Dobby.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Dobby.framework; path = "../Carthage/Checkouts/Dobby/build/Debug-iphoneos/Dobby.framework"; sourceTree = ""; }; 72 | /* End PBXFileReference section */ 73 | 74 | /* Begin PBXFrameworksBuildPhase section */ 75 | DCB2DC141B0D20A9002838A8 /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | DCB2DC711B0D2912002838A8 /* Dobby.framework in Frameworks */, 80 | DCB2DC5C1B0D216D002838A8 /* Result.framework in Frameworks */, 81 | DCB2DC5B1B0D216D002838A8 /* ReactiveCocoa.framework in Frameworks */, 82 | DCB2DC5A1B0D216D002838A8 /* Matryoshka.framework in Frameworks */, 83 | DCB2DC5D1B0D216D002838A8 /* Runes.framework in Frameworks */, 84 | DCB2DC591B0D216D002838A8 /* Argo.framework in Frameworks */, 85 | ); 86 | runOnlyForDeploymentPostprocessing = 0; 87 | }; 88 | DCB2DC201B0D20A9002838A8 /* Frameworks */ = { 89 | isa = PBXFrameworksBuildPhase; 90 | buildActionMask = 2147483647; 91 | files = ( 92 | DCB2DC241B0D20A9002838A8 /* MatryoshkaPlayground.framework in Frameworks */, 93 | ); 94 | runOnlyForDeploymentPostprocessing = 0; 95 | }; 96 | /* End PBXFrameworksBuildPhase section */ 97 | 98 | /* Begin PBXGroup section */ 99 | DCB2DC0E1B0D20A9002838A8 = { 100 | isa = PBXGroup; 101 | children = ( 102 | DCB2DC1A1B0D20A9002838A8 /* MatryoshkaPlayground */, 103 | DCB2DC271B0D20A9002838A8 /* MatryoshkaPlaygroundTests */, 104 | DCB2DC631B0D2198002838A8 /* Frameworks */, 105 | DCB2DC191B0D20A9002838A8 /* Products */, 106 | ); 107 | sourceTree = ""; 108 | }; 109 | DCB2DC191B0D20A9002838A8 /* Products */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | DCB2DC181B0D20A9002838A8 /* MatryoshkaPlayground.framework */, 113 | DCB2DC231B0D20A9002838A8 /* MatryoshkaPlaygroundTests.xctest */, 114 | ); 115 | name = Products; 116 | sourceTree = ""; 117 | }; 118 | DCB2DC1A1B0D20A9002838A8 /* MatryoshkaPlayground */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | DCB2DC341B0D2127002838A8 /* Extensions */, 122 | DCB2DC1D1B0D20A9002838A8 /* MatryoshkaPlayground.h */, 123 | DCB2DC371B0D2127002838A8 /* Models */, 124 | DCB2DC3A1B0D2127002838A8 /* Networking */, 125 | DCB2DC1B1B0D20A9002838A8 /* Supporting Files */, 126 | ); 127 | path = MatryoshkaPlayground; 128 | sourceTree = ""; 129 | }; 130 | DCB2DC1B1B0D20A9002838A8 /* Supporting Files */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | DCB2DC1C1B0D20A9002838A8 /* Info.plist */, 134 | ); 135 | name = "Supporting Files"; 136 | sourceTree = ""; 137 | }; 138 | DCB2DC271B0D20A9002838A8 /* MatryoshkaPlaygroundTests */ = { 139 | isa = PBXGroup; 140 | children = ( 141 | DCB2DC2A1B0D20A9002838A8 /* MatryoshkaPlaygroundTests.swift */, 142 | DCB2DC281B0D20A9002838A8 /* Supporting Files */, 143 | ); 144 | path = MatryoshkaPlaygroundTests; 145 | sourceTree = ""; 146 | }; 147 | DCB2DC281B0D20A9002838A8 /* Supporting Files */ = { 148 | isa = PBXGroup; 149 | children = ( 150 | DCB2DC291B0D20A9002838A8 /* Info.plist */, 151 | ); 152 | name = "Supporting Files"; 153 | sourceTree = ""; 154 | }; 155 | DCB2DC341B0D2127002838A8 /* Extensions */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | DCB2DC351B0D2127002838A8 /* DecodedExtensions.swift */, 159 | DCB2DC361B0D2127002838A8 /* SwiftExtensions.swift */, 160 | ); 161 | path = Extensions; 162 | sourceTree = ""; 163 | }; 164 | DCB2DC371B0D2127002838A8 /* Models */ = { 165 | isa = PBXGroup; 166 | children = ( 167 | DCB2DC381B0D2127002838A8 /* Track.swift */, 168 | DCB2DC391B0D2127002838A8 /* User.swift */, 169 | ); 170 | path = Models; 171 | sourceTree = ""; 172 | }; 173 | DCB2DC3A1B0D2127002838A8 /* Networking */ = { 174 | isa = PBXGroup; 175 | children = ( 176 | DCB2DC3B1B0D2127002838A8 /* HTTPMethod.swift */, 177 | DCB2DC3C1B0D2127002838A8 /* HTTPOperation.swift */, 178 | DCB2DC3D1B0D2127002838A8 /* HTTPParameterEncoding.swift */, 179 | DCB2DC3E1B0D2127002838A8 /* HTTPRequest.swift */, 180 | DCB2DC3F1B0D2127002838A8 /* HTTPResponse.swift */, 181 | DCB2DC401B0D2127002838A8 /* HTTPStatusCode.swift */, 182 | DCB2DC411B0D2127002838A8 /* NetworkManager.swift */, 183 | DCB2DC6B1B0D24D9002838A8 /* Operations */, 184 | DCB2DC451B0D2127002838A8 /* URLOperration.swift */, 185 | ); 186 | path = Networking; 187 | sourceTree = ""; 188 | }; 189 | DCB2DC631B0D2198002838A8 /* Frameworks */ = { 190 | isa = PBXGroup; 191 | children = ( 192 | DCB2DC701B0D2912002838A8 /* Dobby.framework */, 193 | DCB2DC571B0D216D002838A8 /* Result.framework */, 194 | DCB2DC561B0D216D002838A8 /* ReactiveCocoa.framework */, 195 | DCB2DC551B0D216D002838A8 /* Matryoshka.framework */, 196 | DCB2DC581B0D216D002838A8 /* Runes.framework */, 197 | DCB2DC541B0D216D002838A8 /* Argo.framework */, 198 | ); 199 | name = Frameworks; 200 | sourceTree = ""; 201 | }; 202 | DCB2DC6B1B0D24D9002838A8 /* Operations */ = { 203 | isa = PBXGroup; 204 | children = ( 205 | DCB2DC6C1B0D24D9002838A8 /* GetTrack.swift */, 206 | DCB2DC6D1B0D24D9002838A8 /* GetUser.swift */, 207 | ); 208 | path = Operations; 209 | sourceTree = ""; 210 | }; 211 | /* End PBXGroup section */ 212 | 213 | /* Begin PBXHeadersBuildPhase section */ 214 | DCB2DC151B0D20A9002838A8 /* Headers */ = { 215 | isa = PBXHeadersBuildPhase; 216 | buildActionMask = 2147483647; 217 | files = ( 218 | DCB2DC1E1B0D20A9002838A8 /* MatryoshkaPlayground.h in Headers */, 219 | ); 220 | runOnlyForDeploymentPostprocessing = 0; 221 | }; 222 | /* End PBXHeadersBuildPhase section */ 223 | 224 | /* Begin PBXNativeTarget section */ 225 | DCB2DC171B0D20A9002838A8 /* MatryoshkaPlayground */ = { 226 | isa = PBXNativeTarget; 227 | buildConfigurationList = DCB2DC2E1B0D20A9002838A8 /* Build configuration list for PBXNativeTarget "MatryoshkaPlayground" */; 228 | buildPhases = ( 229 | DCB2DC131B0D20A9002838A8 /* Sources */, 230 | DCB2DC141B0D20A9002838A8 /* Frameworks */, 231 | DCB2DC151B0D20A9002838A8 /* Headers */, 232 | DCB2DC161B0D20A9002838A8 /* Resources */, 233 | ); 234 | buildRules = ( 235 | ); 236 | dependencies = ( 237 | ); 238 | name = MatryoshkaPlayground; 239 | productName = MatryoshkaPlayground; 240 | productReference = DCB2DC181B0D20A9002838A8 /* MatryoshkaPlayground.framework */; 241 | productType = "com.apple.product-type.framework"; 242 | }; 243 | DCB2DC221B0D20A9002838A8 /* MatryoshkaPlaygroundTests */ = { 244 | isa = PBXNativeTarget; 245 | buildConfigurationList = DCB2DC311B0D20A9002838A8 /* Build configuration list for PBXNativeTarget "MatryoshkaPlaygroundTests" */; 246 | buildPhases = ( 247 | DCB2DC1F1B0D20A9002838A8 /* Sources */, 248 | DCB2DC201B0D20A9002838A8 /* Frameworks */, 249 | DCB2DC211B0D20A9002838A8 /* Resources */, 250 | ); 251 | buildRules = ( 252 | ); 253 | dependencies = ( 254 | DCB2DC261B0D20A9002838A8 /* PBXTargetDependency */, 255 | ); 256 | name = MatryoshkaPlaygroundTests; 257 | productName = MatryoshkaPlaygroundTests; 258 | productReference = DCB2DC231B0D20A9002838A8 /* MatryoshkaPlaygroundTests.xctest */; 259 | productType = "com.apple.product-type.bundle.unit-test"; 260 | }; 261 | /* End PBXNativeTarget section */ 262 | 263 | /* Begin PBXProject section */ 264 | DCB2DC0F1B0D20A9002838A8 /* Project object */ = { 265 | isa = PBXProject; 266 | attributes = { 267 | LastUpgradeCheck = 0640; 268 | ORGANIZATIONNAME = "Felix Jendrusch"; 269 | TargetAttributes = { 270 | DCB2DC171B0D20A9002838A8 = { 271 | CreatedOnToolsVersion = 6.3.2; 272 | }; 273 | DCB2DC221B0D20A9002838A8 = { 274 | CreatedOnToolsVersion = 6.3.2; 275 | }; 276 | }; 277 | }; 278 | buildConfigurationList = DCB2DC121B0D20A9002838A8 /* Build configuration list for PBXProject "MatryoshkaPlayground" */; 279 | compatibilityVersion = "Xcode 3.2"; 280 | developmentRegion = English; 281 | hasScannedForEncodings = 0; 282 | knownRegions = ( 283 | en, 284 | ); 285 | mainGroup = DCB2DC0E1B0D20A9002838A8; 286 | productRefGroup = DCB2DC191B0D20A9002838A8 /* Products */; 287 | projectDirPath = ""; 288 | projectRoot = ""; 289 | targets = ( 290 | DCB2DC171B0D20A9002838A8 /* MatryoshkaPlayground */, 291 | DCB2DC221B0D20A9002838A8 /* MatryoshkaPlaygroundTests */, 292 | ); 293 | }; 294 | /* End PBXProject section */ 295 | 296 | /* Begin PBXResourcesBuildPhase section */ 297 | DCB2DC161B0D20A9002838A8 /* Resources */ = { 298 | isa = PBXResourcesBuildPhase; 299 | buildActionMask = 2147483647; 300 | files = ( 301 | ); 302 | runOnlyForDeploymentPostprocessing = 0; 303 | }; 304 | DCB2DC211B0D20A9002838A8 /* Resources */ = { 305 | isa = PBXResourcesBuildPhase; 306 | buildActionMask = 2147483647; 307 | files = ( 308 | ); 309 | runOnlyForDeploymentPostprocessing = 0; 310 | }; 311 | /* End PBXResourcesBuildPhase section */ 312 | 313 | /* Begin PBXSourcesBuildPhase section */ 314 | DCB2DC131B0D20A9002838A8 /* Sources */ = { 315 | isa = PBXSourcesBuildPhase; 316 | buildActionMask = 2147483647; 317 | files = ( 318 | DCB2DC4F1B0D2127002838A8 /* HTTPStatusCode.swift in Sources */, 319 | DCB2DC491B0D2127002838A8 /* User.swift in Sources */, 320 | DCB2DC461B0D2127002838A8 /* DecodedExtensions.swift in Sources */, 321 | DCB2DC471B0D2127002838A8 /* SwiftExtensions.swift in Sources */, 322 | DCB2DC501B0D2127002838A8 /* NetworkManager.swift in Sources */, 323 | DCB2DC4A1B0D2127002838A8 /* HTTPMethod.swift in Sources */, 324 | DCB2DC531B0D2127002838A8 /* URLOperration.swift in Sources */, 325 | DCB2DC6F1B0D24D9002838A8 /* GetUser.swift in Sources */, 326 | DCB2DC481B0D2127002838A8 /* Track.swift in Sources */, 327 | DCB2DC4D1B0D2127002838A8 /* HTTPRequest.swift in Sources */, 328 | DCB2DC4E1B0D2127002838A8 /* HTTPResponse.swift in Sources */, 329 | DCB2DC6E1B0D24D9002838A8 /* GetTrack.swift in Sources */, 330 | DCB2DC4B1B0D2127002838A8 /* HTTPOperation.swift in Sources */, 331 | DCB2DC4C1B0D2127002838A8 /* HTTPParameterEncoding.swift in Sources */, 332 | ); 333 | runOnlyForDeploymentPostprocessing = 0; 334 | }; 335 | DCB2DC1F1B0D20A9002838A8 /* Sources */ = { 336 | isa = PBXSourcesBuildPhase; 337 | buildActionMask = 2147483647; 338 | files = ( 339 | DCB2DC2B1B0D20A9002838A8 /* MatryoshkaPlaygroundTests.swift in Sources */, 340 | ); 341 | runOnlyForDeploymentPostprocessing = 0; 342 | }; 343 | /* End PBXSourcesBuildPhase section */ 344 | 345 | /* Begin PBXTargetDependency section */ 346 | DCB2DC261B0D20A9002838A8 /* PBXTargetDependency */ = { 347 | isa = PBXTargetDependency; 348 | target = DCB2DC171B0D20A9002838A8 /* MatryoshkaPlayground */; 349 | targetProxy = DCB2DC251B0D20A9002838A8 /* PBXContainerItemProxy */; 350 | }; 351 | /* End PBXTargetDependency section */ 352 | 353 | /* Begin XCBuildConfiguration section */ 354 | DCB2DC2C1B0D20A9002838A8 /* Debug */ = { 355 | isa = XCBuildConfiguration; 356 | buildSettings = { 357 | ALWAYS_SEARCH_USER_PATHS = NO; 358 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 359 | CLANG_CXX_LIBRARY = "libc++"; 360 | CLANG_ENABLE_MODULES = YES; 361 | CLANG_ENABLE_OBJC_ARC = YES; 362 | CLANG_WARN_BOOL_CONVERSION = YES; 363 | CLANG_WARN_CONSTANT_CONVERSION = YES; 364 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 365 | CLANG_WARN_EMPTY_BODY = YES; 366 | CLANG_WARN_ENUM_CONVERSION = YES; 367 | CLANG_WARN_INT_CONVERSION = YES; 368 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 369 | CLANG_WARN_UNREACHABLE_CODE = YES; 370 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 371 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 372 | COPY_PHASE_STRIP = NO; 373 | CURRENT_PROJECT_VERSION = 1; 374 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 375 | ENABLE_STRICT_OBJC_MSGSEND = YES; 376 | GCC_C_LANGUAGE_STANDARD = gnu99; 377 | GCC_DYNAMIC_NO_PIC = NO; 378 | GCC_NO_COMMON_BLOCKS = YES; 379 | GCC_OPTIMIZATION_LEVEL = 0; 380 | GCC_PREPROCESSOR_DEFINITIONS = ( 381 | "DEBUG=1", 382 | "$(inherited)", 383 | ); 384 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 385 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 386 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 387 | GCC_WARN_UNDECLARED_SELECTOR = YES; 388 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 389 | GCC_WARN_UNUSED_FUNCTION = YES; 390 | GCC_WARN_UNUSED_VARIABLE = YES; 391 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 392 | MTL_ENABLE_DEBUG_INFO = YES; 393 | ONLY_ACTIVE_ARCH = YES; 394 | SDKROOT = iphoneos; 395 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 396 | TARGETED_DEVICE_FAMILY = "1,2"; 397 | VERSIONING_SYSTEM = "apple-generic"; 398 | VERSION_INFO_PREFIX = ""; 399 | }; 400 | name = Debug; 401 | }; 402 | DCB2DC2D1B0D20A9002838A8 /* Release */ = { 403 | isa = XCBuildConfiguration; 404 | buildSettings = { 405 | ALWAYS_SEARCH_USER_PATHS = NO; 406 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 407 | CLANG_CXX_LIBRARY = "libc++"; 408 | CLANG_ENABLE_MODULES = YES; 409 | CLANG_ENABLE_OBJC_ARC = YES; 410 | CLANG_WARN_BOOL_CONVERSION = YES; 411 | CLANG_WARN_CONSTANT_CONVERSION = YES; 412 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 413 | CLANG_WARN_EMPTY_BODY = YES; 414 | CLANG_WARN_ENUM_CONVERSION = YES; 415 | CLANG_WARN_INT_CONVERSION = YES; 416 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 417 | CLANG_WARN_UNREACHABLE_CODE = YES; 418 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 419 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 420 | COPY_PHASE_STRIP = NO; 421 | CURRENT_PROJECT_VERSION = 1; 422 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 423 | ENABLE_NS_ASSERTIONS = NO; 424 | ENABLE_STRICT_OBJC_MSGSEND = YES; 425 | GCC_C_LANGUAGE_STANDARD = gnu99; 426 | GCC_NO_COMMON_BLOCKS = YES; 427 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 428 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 429 | GCC_WARN_UNDECLARED_SELECTOR = YES; 430 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 431 | GCC_WARN_UNUSED_FUNCTION = YES; 432 | GCC_WARN_UNUSED_VARIABLE = YES; 433 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 434 | MTL_ENABLE_DEBUG_INFO = NO; 435 | SDKROOT = iphoneos; 436 | TARGETED_DEVICE_FAMILY = "1,2"; 437 | VALIDATE_PRODUCT = YES; 438 | VERSIONING_SYSTEM = "apple-generic"; 439 | VERSION_INFO_PREFIX = ""; 440 | }; 441 | name = Release; 442 | }; 443 | DCB2DC2F1B0D20A9002838A8 /* Debug */ = { 444 | isa = XCBuildConfiguration; 445 | buildSettings = { 446 | DEFINES_MODULE = YES; 447 | DYLIB_COMPATIBILITY_VERSION = 1; 448 | DYLIB_CURRENT_VERSION = 1; 449 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 450 | FRAMEWORK_SEARCH_PATHS = ( 451 | "$(inherited)", 452 | "../Carthage/Checkouts/Argo/build/Debug-iphoneos", 453 | "../build/Debug-iphoneos", 454 | "../Carthage/Checkouts/ReactiveCocoa/build/Debug-iphoneos", 455 | "../Carthage/Checkouts/Result/build/Debug-iphoneos", 456 | "../Carthage/Checkouts/runes/build/Debug-iphoneos", 457 | "/Users/felix/Developer/Matryoshka/Carthage/Checkouts/Dobby/build/Debug-iphoneos", 458 | ); 459 | INFOPLIST_FILE = MatryoshkaPlayground/Info.plist; 460 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 461 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 462 | PRODUCT_NAME = "$(TARGET_NAME)"; 463 | SKIP_INSTALL = YES; 464 | }; 465 | name = Debug; 466 | }; 467 | DCB2DC301B0D20A9002838A8 /* Release */ = { 468 | isa = XCBuildConfiguration; 469 | buildSettings = { 470 | DEFINES_MODULE = YES; 471 | DYLIB_COMPATIBILITY_VERSION = 1; 472 | DYLIB_CURRENT_VERSION = 1; 473 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 474 | FRAMEWORK_SEARCH_PATHS = ( 475 | "$(inherited)", 476 | "../Carthage/Checkouts/Argo/build/Debug-iphoneos", 477 | "../build/Debug-iphoneos", 478 | "../Carthage/Checkouts/ReactiveCocoa/build/Debug-iphoneos", 479 | "../Carthage/Checkouts/Result/build/Debug-iphoneos", 480 | "../Carthage/Checkouts/runes/build/Debug-iphoneos", 481 | "/Users/felix/Developer/Matryoshka/Carthage/Checkouts/Dobby/build/Debug-iphoneos", 482 | ); 483 | INFOPLIST_FILE = MatryoshkaPlayground/Info.plist; 484 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 485 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 486 | PRODUCT_NAME = "$(TARGET_NAME)"; 487 | SKIP_INSTALL = YES; 488 | }; 489 | name = Release; 490 | }; 491 | DCB2DC321B0D20A9002838A8 /* Debug */ = { 492 | isa = XCBuildConfiguration; 493 | buildSettings = { 494 | FRAMEWORK_SEARCH_PATHS = ( 495 | "$(SDKROOT)/Developer/Library/Frameworks", 496 | "$(inherited)", 497 | ); 498 | GCC_PREPROCESSOR_DEFINITIONS = ( 499 | "DEBUG=1", 500 | "$(inherited)", 501 | ); 502 | INFOPLIST_FILE = MatryoshkaPlaygroundTests/Info.plist; 503 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 504 | PRODUCT_NAME = "$(TARGET_NAME)"; 505 | }; 506 | name = Debug; 507 | }; 508 | DCB2DC331B0D20A9002838A8 /* Release */ = { 509 | isa = XCBuildConfiguration; 510 | buildSettings = { 511 | FRAMEWORK_SEARCH_PATHS = ( 512 | "$(SDKROOT)/Developer/Library/Frameworks", 513 | "$(inherited)", 514 | ); 515 | INFOPLIST_FILE = MatryoshkaPlaygroundTests/Info.plist; 516 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 517 | PRODUCT_NAME = "$(TARGET_NAME)"; 518 | }; 519 | name = Release; 520 | }; 521 | /* End XCBuildConfiguration section */ 522 | 523 | /* Begin XCConfigurationList section */ 524 | DCB2DC121B0D20A9002838A8 /* Build configuration list for PBXProject "MatryoshkaPlayground" */ = { 525 | isa = XCConfigurationList; 526 | buildConfigurations = ( 527 | DCB2DC2C1B0D20A9002838A8 /* Debug */, 528 | DCB2DC2D1B0D20A9002838A8 /* Release */, 529 | ); 530 | defaultConfigurationIsVisible = 0; 531 | defaultConfigurationName = Release; 532 | }; 533 | DCB2DC2E1B0D20A9002838A8 /* Build configuration list for PBXNativeTarget "MatryoshkaPlayground" */ = { 534 | isa = XCConfigurationList; 535 | buildConfigurations = ( 536 | DCB2DC2F1B0D20A9002838A8 /* Debug */, 537 | DCB2DC301B0D20A9002838A8 /* Release */, 538 | ); 539 | defaultConfigurationIsVisible = 0; 540 | defaultConfigurationName = Release; 541 | }; 542 | DCB2DC311B0D20A9002838A8 /* Build configuration list for PBXNativeTarget "MatryoshkaPlaygroundTests" */ = { 543 | isa = XCConfigurationList; 544 | buildConfigurations = ( 545 | DCB2DC321B0D20A9002838A8 /* Debug */, 546 | DCB2DC331B0D20A9002838A8 /* Release */, 547 | ); 548 | defaultConfigurationIsVisible = 0; 549 | defaultConfigurationName = Release; 550 | }; 551 | /* End XCConfigurationList section */ 552 | }; 553 | rootObject = DCB2DC0F1B0D20A9002838A8 /* Project object */; 554 | } 555 | -------------------------------------------------------------------------------- /Matryoshka.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | DC087BA51B0CE5B500C95EBC /* Matryoshka.h in Headers */ = {isa = PBXBuildFile; fileRef = DC087BA41B0CE5B500C95EBC /* Matryoshka.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | DC087BAB1B0CE5B500C95EBC /* Matryoshka.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC087B9F1B0CE5B500C95EBC /* Matryoshka.framework */; }; 12 | DC087BB21B0CE5B500C95EBC /* MatryoshkaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC087BB11B0CE5B500C95EBC /* MatryoshkaTests.swift */; }; 13 | DC087BCB1B0CE66A00C95EBC /* Matryoshka.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC087BC01B0CE66900C95EBC /* Matryoshka.framework */; }; 14 | DC0E04D21B0D1A5F0037D086 /* ReactiveCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC0E04CD1B0D1A4C0037D086 /* ReactiveCocoa.framework */; }; 15 | DC0E04D31B0D1A630037D086 /* ReactiveCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC0E04D01B0D1A550037D086 /* ReactiveCocoa.framework */; }; 16 | DC0E04D41B0D1A700037D086 /* Box.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC0E04CF1B0D1A550037D086 /* Box.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 17 | DC0E04D51B0D1A700037D086 /* Result.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC0E04D11B0D1A550037D086 /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 18 | DC0E04D61B0D1A700037D086 /* ReactiveCocoa.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC0E04D01B0D1A550037D086 /* ReactiveCocoa.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 19 | DC0E04D71B0D1A750037D086 /* Box.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC0E04CC1B0D1A4C0037D086 /* Box.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 20 | DC0E04D81B0D1A750037D086 /* Result.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC0E04CE1B0D1A4C0037D086 /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 21 | DC0E04D91B0D1A750037D086 /* ReactiveCocoa.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC0E04CD1B0D1A4C0037D086 /* ReactiveCocoa.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 22 | DC4B4AC41B0CE7B000605EDD /* Operation.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4B4AC01B0CE7B000605EDD /* Operation.swift */; }; 23 | DC4B4AC51B0CE7B000605EDD /* Operation.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4B4AC01B0CE7B000605EDD /* Operation.swift */; }; 24 | DC4B4AC61B0CE7B000605EDD /* OperationFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4B4AC11B0CE7B000605EDD /* OperationFactory.swift */; }; 25 | DC4B4AC71B0CE7B000605EDD /* OperationFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4B4AC11B0CE7B000605EDD /* OperationFactory.swift */; }; 26 | DC4B4AC81B0CE7B000605EDD /* OperationFactoryType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4B4AC21B0CE7B000605EDD /* OperationFactoryType.swift */; }; 27 | DC4B4AC91B0CE7B000605EDD /* OperationFactoryType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4B4AC21B0CE7B000605EDD /* OperationFactoryType.swift */; }; 28 | DC4B4ACA1B0CE7B000605EDD /* OperationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4B4AC31B0CE7B000605EDD /* OperationType.swift */; }; 29 | DC4B4ACB1B0CE7B000605EDD /* OperationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4B4AC31B0CE7B000605EDD /* OperationType.swift */; }; 30 | DC4B4ADF1B0CEB8100605EDD /* Matryoshka.h in Headers */ = {isa = PBXBuildFile; fileRef = DC087BA41B0CE5B500C95EBC /* Matryoshka.h */; settings = {ATTRIBUTES = (Public, ); }; }; 31 | DC4B4AE01B0CEB8E00605EDD /* MatryoshkaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC087BB11B0CE5B500C95EBC /* MatryoshkaTests.swift */; }; 32 | /* End PBXBuildFile section */ 33 | 34 | /* Begin PBXContainerItemProxy section */ 35 | DC087BAC1B0CE5B500C95EBC /* PBXContainerItemProxy */ = { 36 | isa = PBXContainerItemProxy; 37 | containerPortal = DC087B961B0CE5B500C95EBC /* Project object */; 38 | proxyType = 1; 39 | remoteGlobalIDString = DC087B9E1B0CE5B500C95EBC; 40 | remoteInfo = Matryoshka; 41 | }; 42 | DC087BCC1B0CE66A00C95EBC /* PBXContainerItemProxy */ = { 43 | isa = PBXContainerItemProxy; 44 | containerPortal = DC087B961B0CE5B500C95EBC /* Project object */; 45 | proxyType = 1; 46 | remoteGlobalIDString = DC087BBF1B0CE66900C95EBC; 47 | remoteInfo = "Matryoshka-Mac"; 48 | }; 49 | /* End PBXContainerItemProxy section */ 50 | 51 | /* Begin PBXCopyFilesBuildPhase section */ 52 | DC0E04C91B0D19AD0037D086 /* CopyFiles */ = { 53 | isa = PBXCopyFilesBuildPhase; 54 | buildActionMask = 2147483647; 55 | dstPath = ""; 56 | dstSubfolderSpec = 10; 57 | files = ( 58 | DC0E04D71B0D1A750037D086 /* Box.framework in CopyFiles */, 59 | DC0E04D81B0D1A750037D086 /* Result.framework in CopyFiles */, 60 | DC0E04D91B0D1A750037D086 /* ReactiveCocoa.framework in CopyFiles */, 61 | ); 62 | runOnlyForDeploymentPostprocessing = 0; 63 | }; 64 | DC0E04CB1B0D1A270037D086 /* CopyFiles */ = { 65 | isa = PBXCopyFilesBuildPhase; 66 | buildActionMask = 2147483647; 67 | dstPath = ""; 68 | dstSubfolderSpec = 10; 69 | files = ( 70 | DC0E04D41B0D1A700037D086 /* Box.framework in CopyFiles */, 71 | DC0E04D51B0D1A700037D086 /* Result.framework in CopyFiles */, 72 | DC0E04D61B0D1A700037D086 /* ReactiveCocoa.framework in CopyFiles */, 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | /* End PBXCopyFilesBuildPhase section */ 77 | 78 | /* Begin PBXFileReference section */ 79 | DC087B9F1B0CE5B500C95EBC /* Matryoshka.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Matryoshka.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 80 | DC087BA31B0CE5B500C95EBC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 81 | DC087BA41B0CE5B500C95EBC /* Matryoshka.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Matryoshka.h; sourceTree = ""; }; 82 | DC087BAA1B0CE5B500C95EBC /* MatryoshkaTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MatryoshkaTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 83 | DC087BB01B0CE5B500C95EBC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 84 | DC087BB11B0CE5B500C95EBC /* MatryoshkaTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatryoshkaTests.swift; sourceTree = ""; }; 85 | DC087BC01B0CE66900C95EBC /* Matryoshka.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Matryoshka.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 86 | DC087BCA1B0CE66900C95EBC /* MatryoshkaTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MatryoshkaTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 87 | DC0E04CC1B0D1A4C0037D086 /* Box.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Box.framework; path = Carthage/Build/iOS/Box.framework; sourceTree = ""; }; 88 | DC0E04CD1B0D1A4C0037D086 /* ReactiveCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveCocoa.framework; path = Carthage/Build/iOS/ReactiveCocoa.framework; sourceTree = ""; }; 89 | DC0E04CE1B0D1A4C0037D086 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Result.framework; path = Carthage/Build/iOS/Result.framework; sourceTree = ""; }; 90 | DC0E04CF1B0D1A550037D086 /* Box.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Box.framework; path = Carthage/Build/Mac/Box.framework; sourceTree = ""; }; 91 | DC0E04D01B0D1A550037D086 /* ReactiveCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveCocoa.framework; path = Carthage/Build/Mac/ReactiveCocoa.framework; sourceTree = ""; }; 92 | DC0E04D11B0D1A550037D086 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Result.framework; path = Carthage/Build/Mac/Result.framework; sourceTree = ""; }; 93 | DC4B4AC01B0CE7B000605EDD /* Operation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Operation.swift; sourceTree = ""; }; 94 | DC4B4AC11B0CE7B000605EDD /* OperationFactory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OperationFactory.swift; sourceTree = ""; }; 95 | DC4B4AC21B0CE7B000605EDD /* OperationFactoryType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OperationFactoryType.swift; sourceTree = ""; }; 96 | DC4B4AC31B0CE7B000605EDD /* OperationType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OperationType.swift; sourceTree = ""; }; 97 | /* End PBXFileReference section */ 98 | 99 | /* Begin PBXFrameworksBuildPhase section */ 100 | DC087B9B1B0CE5B500C95EBC /* Frameworks */ = { 101 | isa = PBXFrameworksBuildPhase; 102 | buildActionMask = 2147483647; 103 | files = ( 104 | DC0E04D21B0D1A5F0037D086 /* ReactiveCocoa.framework in Frameworks */, 105 | ); 106 | runOnlyForDeploymentPostprocessing = 0; 107 | }; 108 | DC087BA71B0CE5B500C95EBC /* Frameworks */ = { 109 | isa = PBXFrameworksBuildPhase; 110 | buildActionMask = 2147483647; 111 | files = ( 112 | DC087BAB1B0CE5B500C95EBC /* Matryoshka.framework in Frameworks */, 113 | ); 114 | runOnlyForDeploymentPostprocessing = 0; 115 | }; 116 | DC087BBC1B0CE66900C95EBC /* Frameworks */ = { 117 | isa = PBXFrameworksBuildPhase; 118 | buildActionMask = 2147483647; 119 | files = ( 120 | DC0E04D31B0D1A630037D086 /* ReactiveCocoa.framework in Frameworks */, 121 | ); 122 | runOnlyForDeploymentPostprocessing = 0; 123 | }; 124 | DC087BC71B0CE66900C95EBC /* Frameworks */ = { 125 | isa = PBXFrameworksBuildPhase; 126 | buildActionMask = 2147483647; 127 | files = ( 128 | DC087BCB1B0CE66A00C95EBC /* Matryoshka.framework in Frameworks */, 129 | ); 130 | runOnlyForDeploymentPostprocessing = 0; 131 | }; 132 | /* End PBXFrameworksBuildPhase section */ 133 | 134 | /* Begin PBXGroup section */ 135 | DC087B951B0CE5B500C95EBC = { 136 | isa = PBXGroup; 137 | children = ( 138 | DC087BA11B0CE5B500C95EBC /* Matryoshka */, 139 | DC087BAE1B0CE5B500C95EBC /* MatryoshkaTests */, 140 | DCFA7B341B0CF05800E0C675 /* Frameworks */, 141 | DC087BA01B0CE5B500C95EBC /* Products */, 142 | ); 143 | sourceTree = ""; 144 | }; 145 | DC087BA01B0CE5B500C95EBC /* Products */ = { 146 | isa = PBXGroup; 147 | children = ( 148 | DC087B9F1B0CE5B500C95EBC /* Matryoshka.framework */, 149 | DC087BAA1B0CE5B500C95EBC /* MatryoshkaTests.xctest */, 150 | DC087BC01B0CE66900C95EBC /* Matryoshka.framework */, 151 | DC087BCA1B0CE66900C95EBC /* MatryoshkaTests.xctest */, 152 | ); 153 | name = Products; 154 | sourceTree = ""; 155 | }; 156 | DC087BA11B0CE5B500C95EBC /* Matryoshka */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | DC087BA41B0CE5B500C95EBC /* Matryoshka.h */, 160 | DC4B4AC01B0CE7B000605EDD /* Operation.swift */, 161 | DC4B4AC11B0CE7B000605EDD /* OperationFactory.swift */, 162 | DC4B4AC21B0CE7B000605EDD /* OperationFactoryType.swift */, 163 | DC4B4AC31B0CE7B000605EDD /* OperationType.swift */, 164 | DC087BA21B0CE5B500C95EBC /* Supporting Files */, 165 | ); 166 | path = Matryoshka; 167 | sourceTree = ""; 168 | }; 169 | DC087BA21B0CE5B500C95EBC /* Supporting Files */ = { 170 | isa = PBXGroup; 171 | children = ( 172 | DC087BA31B0CE5B500C95EBC /* Info.plist */, 173 | ); 174 | name = "Supporting Files"; 175 | sourceTree = ""; 176 | }; 177 | DC087BAE1B0CE5B500C95EBC /* MatryoshkaTests */ = { 178 | isa = PBXGroup; 179 | children = ( 180 | DC087BB11B0CE5B500C95EBC /* MatryoshkaTests.swift */, 181 | DC087BAF1B0CE5B500C95EBC /* Supporting Files */, 182 | ); 183 | path = MatryoshkaTests; 184 | sourceTree = ""; 185 | }; 186 | DC087BAF1B0CE5B500C95EBC /* Supporting Files */ = { 187 | isa = PBXGroup; 188 | children = ( 189 | DC087BB01B0CE5B500C95EBC /* Info.plist */, 190 | ); 191 | name = "Supporting Files"; 192 | sourceTree = ""; 193 | }; 194 | DCFA7B321B0CF05000E0C675 /* Mac */ = { 195 | isa = PBXGroup; 196 | children = ( 197 | DC0E04CF1B0D1A550037D086 /* Box.framework */, 198 | DC0E04D11B0D1A550037D086 /* Result.framework */, 199 | DC0E04D01B0D1A550037D086 /* ReactiveCocoa.framework */, 200 | ); 201 | name = Mac; 202 | sourceTree = ""; 203 | }; 204 | DCFA7B331B0CF05400E0C675 /* iOS */ = { 205 | isa = PBXGroup; 206 | children = ( 207 | DC0E04CC1B0D1A4C0037D086 /* Box.framework */, 208 | DC0E04CE1B0D1A4C0037D086 /* Result.framework */, 209 | DC0E04CD1B0D1A4C0037D086 /* ReactiveCocoa.framework */, 210 | ); 211 | name = iOS; 212 | sourceTree = ""; 213 | }; 214 | DCFA7B341B0CF05800E0C675 /* Frameworks */ = { 215 | isa = PBXGroup; 216 | children = ( 217 | DCFA7B331B0CF05400E0C675 /* iOS */, 218 | DCFA7B321B0CF05000E0C675 /* Mac */, 219 | ); 220 | name = Frameworks; 221 | sourceTree = ""; 222 | }; 223 | /* End PBXGroup section */ 224 | 225 | /* Begin PBXHeadersBuildPhase section */ 226 | DC087B9C1B0CE5B500C95EBC /* Headers */ = { 227 | isa = PBXHeadersBuildPhase; 228 | buildActionMask = 2147483647; 229 | files = ( 230 | DC087BA51B0CE5B500C95EBC /* Matryoshka.h in Headers */, 231 | ); 232 | runOnlyForDeploymentPostprocessing = 0; 233 | }; 234 | DC087BBD1B0CE66900C95EBC /* Headers */ = { 235 | isa = PBXHeadersBuildPhase; 236 | buildActionMask = 2147483647; 237 | files = ( 238 | DC4B4ADF1B0CEB8100605EDD /* Matryoshka.h in Headers */, 239 | ); 240 | runOnlyForDeploymentPostprocessing = 0; 241 | }; 242 | /* End PBXHeadersBuildPhase section */ 243 | 244 | /* Begin PBXNativeTarget section */ 245 | DC087B9E1B0CE5B500C95EBC /* Matryoshka-iOS */ = { 246 | isa = PBXNativeTarget; 247 | buildConfigurationList = DC087BB51B0CE5B500C95EBC /* Build configuration list for PBXNativeTarget "Matryoshka-iOS" */; 248 | buildPhases = ( 249 | DC087B9A1B0CE5B500C95EBC /* Sources */, 250 | DC087B9B1B0CE5B500C95EBC /* Frameworks */, 251 | DC087B9C1B0CE5B500C95EBC /* Headers */, 252 | DC087B9D1B0CE5B500C95EBC /* Resources */, 253 | ); 254 | buildRules = ( 255 | ); 256 | dependencies = ( 257 | ); 258 | name = "Matryoshka-iOS"; 259 | productName = Matryoshka; 260 | productReference = DC087B9F1B0CE5B500C95EBC /* Matryoshka.framework */; 261 | productType = "com.apple.product-type.framework"; 262 | }; 263 | DC087BA91B0CE5B500C95EBC /* Matryoshka-iOSTests */ = { 264 | isa = PBXNativeTarget; 265 | buildConfigurationList = DC087BB81B0CE5B500C95EBC /* Build configuration list for PBXNativeTarget "Matryoshka-iOSTests" */; 266 | buildPhases = ( 267 | DC087BA61B0CE5B500C95EBC /* Sources */, 268 | DC087BA71B0CE5B500C95EBC /* Frameworks */, 269 | DC087BA81B0CE5B500C95EBC /* Resources */, 270 | DC0E04C91B0D19AD0037D086 /* CopyFiles */, 271 | ); 272 | buildRules = ( 273 | ); 274 | dependencies = ( 275 | DC087BAD1B0CE5B500C95EBC /* PBXTargetDependency */, 276 | ); 277 | name = "Matryoshka-iOSTests"; 278 | productName = MatryoshkaTests; 279 | productReference = DC087BAA1B0CE5B500C95EBC /* MatryoshkaTests.xctest */; 280 | productType = "com.apple.product-type.bundle.unit-test"; 281 | }; 282 | DC087BBF1B0CE66900C95EBC /* Matryoshka-Mac */ = { 283 | isa = PBXNativeTarget; 284 | buildConfigurationList = DC087BD31B0CE66A00C95EBC /* Build configuration list for PBXNativeTarget "Matryoshka-Mac" */; 285 | buildPhases = ( 286 | DC087BBB1B0CE66900C95EBC /* Sources */, 287 | DC087BBC1B0CE66900C95EBC /* Frameworks */, 288 | DC087BBD1B0CE66900C95EBC /* Headers */, 289 | DC087BBE1B0CE66900C95EBC /* Resources */, 290 | ); 291 | buildRules = ( 292 | ); 293 | dependencies = ( 294 | ); 295 | name = "Matryoshka-Mac"; 296 | productName = "Matryoshka-Mac"; 297 | productReference = DC087BC01B0CE66900C95EBC /* Matryoshka.framework */; 298 | productType = "com.apple.product-type.framework"; 299 | }; 300 | DC087BC91B0CE66900C95EBC /* Matryoshka-MacTests */ = { 301 | isa = PBXNativeTarget; 302 | buildConfigurationList = DC087BD61B0CE66A00C95EBC /* Build configuration list for PBXNativeTarget "Matryoshka-MacTests" */; 303 | buildPhases = ( 304 | DC087BC61B0CE66900C95EBC /* Sources */, 305 | DC087BC71B0CE66900C95EBC /* Frameworks */, 306 | DC087BC81B0CE66900C95EBC /* Resources */, 307 | DC0E04CB1B0D1A270037D086 /* CopyFiles */, 308 | ); 309 | buildRules = ( 310 | ); 311 | dependencies = ( 312 | DC087BCD1B0CE66A00C95EBC /* PBXTargetDependency */, 313 | ); 314 | name = "Matryoshka-MacTests"; 315 | productName = "Matryoshka-MacTests"; 316 | productReference = DC087BCA1B0CE66900C95EBC /* MatryoshkaTests.xctest */; 317 | productType = "com.apple.product-type.bundle.unit-test"; 318 | }; 319 | /* End PBXNativeTarget section */ 320 | 321 | /* Begin PBXProject section */ 322 | DC087B961B0CE5B500C95EBC /* Project object */ = { 323 | isa = PBXProject; 324 | attributes = { 325 | LastUpgradeCheck = 0640; 326 | ORGANIZATIONNAME = "Felix Jendrusch"; 327 | TargetAttributes = { 328 | DC087B9E1B0CE5B500C95EBC = { 329 | CreatedOnToolsVersion = 6.3.2; 330 | }; 331 | DC087BA91B0CE5B500C95EBC = { 332 | CreatedOnToolsVersion = 6.3.2; 333 | }; 334 | DC087BBF1B0CE66900C95EBC = { 335 | CreatedOnToolsVersion = 6.3.2; 336 | }; 337 | DC087BC91B0CE66900C95EBC = { 338 | CreatedOnToolsVersion = 6.3.2; 339 | }; 340 | }; 341 | }; 342 | buildConfigurationList = DC087B991B0CE5B500C95EBC /* Build configuration list for PBXProject "Matryoshka" */; 343 | compatibilityVersion = "Xcode 3.2"; 344 | developmentRegion = English; 345 | hasScannedForEncodings = 0; 346 | knownRegions = ( 347 | en, 348 | ); 349 | mainGroup = DC087B951B0CE5B500C95EBC; 350 | productRefGroup = DC087BA01B0CE5B500C95EBC /* Products */; 351 | projectDirPath = ""; 352 | projectRoot = ""; 353 | targets = ( 354 | DC087B9E1B0CE5B500C95EBC /* Matryoshka-iOS */, 355 | DC087BA91B0CE5B500C95EBC /* Matryoshka-iOSTests */, 356 | DC087BBF1B0CE66900C95EBC /* Matryoshka-Mac */, 357 | DC087BC91B0CE66900C95EBC /* Matryoshka-MacTests */, 358 | ); 359 | }; 360 | /* End PBXProject section */ 361 | 362 | /* Begin PBXResourcesBuildPhase section */ 363 | DC087B9D1B0CE5B500C95EBC /* Resources */ = { 364 | isa = PBXResourcesBuildPhase; 365 | buildActionMask = 2147483647; 366 | files = ( 367 | ); 368 | runOnlyForDeploymentPostprocessing = 0; 369 | }; 370 | DC087BA81B0CE5B500C95EBC /* Resources */ = { 371 | isa = PBXResourcesBuildPhase; 372 | buildActionMask = 2147483647; 373 | files = ( 374 | ); 375 | runOnlyForDeploymentPostprocessing = 0; 376 | }; 377 | DC087BBE1B0CE66900C95EBC /* Resources */ = { 378 | isa = PBXResourcesBuildPhase; 379 | buildActionMask = 2147483647; 380 | files = ( 381 | ); 382 | runOnlyForDeploymentPostprocessing = 0; 383 | }; 384 | DC087BC81B0CE66900C95EBC /* Resources */ = { 385 | isa = PBXResourcesBuildPhase; 386 | buildActionMask = 2147483647; 387 | files = ( 388 | ); 389 | runOnlyForDeploymentPostprocessing = 0; 390 | }; 391 | /* End PBXResourcesBuildPhase section */ 392 | 393 | /* Begin PBXSourcesBuildPhase section */ 394 | DC087B9A1B0CE5B500C95EBC /* Sources */ = { 395 | isa = PBXSourcesBuildPhase; 396 | buildActionMask = 2147483647; 397 | files = ( 398 | DC4B4AC61B0CE7B000605EDD /* OperationFactory.swift in Sources */, 399 | DC4B4ACA1B0CE7B000605EDD /* OperationType.swift in Sources */, 400 | DC4B4AC81B0CE7B000605EDD /* OperationFactoryType.swift in Sources */, 401 | DC4B4AC41B0CE7B000605EDD /* Operation.swift in Sources */, 402 | ); 403 | runOnlyForDeploymentPostprocessing = 0; 404 | }; 405 | DC087BA61B0CE5B500C95EBC /* Sources */ = { 406 | isa = PBXSourcesBuildPhase; 407 | buildActionMask = 2147483647; 408 | files = ( 409 | DC087BB21B0CE5B500C95EBC /* MatryoshkaTests.swift in Sources */, 410 | ); 411 | runOnlyForDeploymentPostprocessing = 0; 412 | }; 413 | DC087BBB1B0CE66900C95EBC /* Sources */ = { 414 | isa = PBXSourcesBuildPhase; 415 | buildActionMask = 2147483647; 416 | files = ( 417 | DC4B4AC71B0CE7B000605EDD /* OperationFactory.swift in Sources */, 418 | DC4B4ACB1B0CE7B000605EDD /* OperationType.swift in Sources */, 419 | DC4B4AC91B0CE7B000605EDD /* OperationFactoryType.swift in Sources */, 420 | DC4B4AC51B0CE7B000605EDD /* Operation.swift in Sources */, 421 | ); 422 | runOnlyForDeploymentPostprocessing = 0; 423 | }; 424 | DC087BC61B0CE66900C95EBC /* Sources */ = { 425 | isa = PBXSourcesBuildPhase; 426 | buildActionMask = 2147483647; 427 | files = ( 428 | DC4B4AE01B0CEB8E00605EDD /* MatryoshkaTests.swift in Sources */, 429 | ); 430 | runOnlyForDeploymentPostprocessing = 0; 431 | }; 432 | /* End PBXSourcesBuildPhase section */ 433 | 434 | /* Begin PBXTargetDependency section */ 435 | DC087BAD1B0CE5B500C95EBC /* PBXTargetDependency */ = { 436 | isa = PBXTargetDependency; 437 | target = DC087B9E1B0CE5B500C95EBC /* Matryoshka-iOS */; 438 | targetProxy = DC087BAC1B0CE5B500C95EBC /* PBXContainerItemProxy */; 439 | }; 440 | DC087BCD1B0CE66A00C95EBC /* PBXTargetDependency */ = { 441 | isa = PBXTargetDependency; 442 | target = DC087BBF1B0CE66900C95EBC /* Matryoshka-Mac */; 443 | targetProxy = DC087BCC1B0CE66A00C95EBC /* PBXContainerItemProxy */; 444 | }; 445 | /* End PBXTargetDependency section */ 446 | 447 | /* Begin XCBuildConfiguration section */ 448 | DC087BB31B0CE5B500C95EBC /* Debug */ = { 449 | isa = XCBuildConfiguration; 450 | buildSettings = { 451 | ALWAYS_SEARCH_USER_PATHS = NO; 452 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 453 | CLANG_CXX_LIBRARY = "libc++"; 454 | CLANG_ENABLE_MODULES = YES; 455 | CLANG_ENABLE_OBJC_ARC = YES; 456 | CLANG_WARN_BOOL_CONVERSION = YES; 457 | CLANG_WARN_CONSTANT_CONVERSION = YES; 458 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 459 | CLANG_WARN_EMPTY_BODY = YES; 460 | CLANG_WARN_ENUM_CONVERSION = YES; 461 | CLANG_WARN_INT_CONVERSION = YES; 462 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 463 | CLANG_WARN_UNREACHABLE_CODE = YES; 464 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 465 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 466 | COPY_PHASE_STRIP = NO; 467 | CURRENT_PROJECT_VERSION = 1; 468 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 469 | ENABLE_STRICT_OBJC_MSGSEND = YES; 470 | GCC_C_LANGUAGE_STANDARD = gnu99; 471 | GCC_DYNAMIC_NO_PIC = NO; 472 | GCC_NO_COMMON_BLOCKS = YES; 473 | GCC_OPTIMIZATION_LEVEL = 0; 474 | GCC_PREPROCESSOR_DEFINITIONS = ( 475 | "DEBUG=1", 476 | "$(inherited)", 477 | ); 478 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 479 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 480 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 481 | GCC_WARN_UNDECLARED_SELECTOR = YES; 482 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 483 | GCC_WARN_UNUSED_FUNCTION = YES; 484 | GCC_WARN_UNUSED_VARIABLE = YES; 485 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 486 | MACOSX_DEPLOYMENT_TARGET = 10.9; 487 | MTL_ENABLE_DEBUG_INFO = YES; 488 | ONLY_ACTIVE_ARCH = YES; 489 | PRODUCT_NAME = "$(PROJECT_NAME)"; 490 | SDKROOT = iphoneos; 491 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 492 | TARGETED_DEVICE_FAMILY = "1,2"; 493 | VERSIONING_SYSTEM = "apple-generic"; 494 | VERSION_INFO_PREFIX = ""; 495 | }; 496 | name = Debug; 497 | }; 498 | DC087BB41B0CE5B500C95EBC /* Release */ = { 499 | isa = XCBuildConfiguration; 500 | buildSettings = { 501 | ALWAYS_SEARCH_USER_PATHS = NO; 502 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 503 | CLANG_CXX_LIBRARY = "libc++"; 504 | CLANG_ENABLE_MODULES = YES; 505 | CLANG_ENABLE_OBJC_ARC = YES; 506 | CLANG_WARN_BOOL_CONVERSION = YES; 507 | CLANG_WARN_CONSTANT_CONVERSION = YES; 508 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 509 | CLANG_WARN_EMPTY_BODY = YES; 510 | CLANG_WARN_ENUM_CONVERSION = YES; 511 | CLANG_WARN_INT_CONVERSION = YES; 512 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 513 | CLANG_WARN_UNREACHABLE_CODE = YES; 514 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 515 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 516 | COPY_PHASE_STRIP = NO; 517 | CURRENT_PROJECT_VERSION = 1; 518 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 519 | ENABLE_NS_ASSERTIONS = NO; 520 | ENABLE_STRICT_OBJC_MSGSEND = YES; 521 | GCC_C_LANGUAGE_STANDARD = gnu99; 522 | GCC_NO_COMMON_BLOCKS = YES; 523 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 524 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 525 | GCC_WARN_UNDECLARED_SELECTOR = YES; 526 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 527 | GCC_WARN_UNUSED_FUNCTION = YES; 528 | GCC_WARN_UNUSED_VARIABLE = YES; 529 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 530 | MACOSX_DEPLOYMENT_TARGET = 10.9; 531 | MTL_ENABLE_DEBUG_INFO = NO; 532 | PRODUCT_NAME = "$(PROJECT_NAME)"; 533 | SDKROOT = iphoneos; 534 | TARGETED_DEVICE_FAMILY = "1,2"; 535 | VALIDATE_PRODUCT = YES; 536 | VERSIONING_SYSTEM = "apple-generic"; 537 | VERSION_INFO_PREFIX = ""; 538 | }; 539 | name = Release; 540 | }; 541 | DC087BB61B0CE5B500C95EBC /* Debug */ = { 542 | isa = XCBuildConfiguration; 543 | buildSettings = { 544 | CLANG_ENABLE_MODULES = YES; 545 | DEFINES_MODULE = YES; 546 | DYLIB_COMPATIBILITY_VERSION = 1; 547 | DYLIB_CURRENT_VERSION = 1; 548 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 549 | FRAMEWORK_SEARCH_PATHS = ( 550 | "$(inherited)", 551 | "$(PROJECT_DIR)/Carthage/Build/iOS", 552 | ); 553 | INFOPLIST_FILE = Matryoshka/Info.plist; 554 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 555 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 556 | PRODUCT_NAME = "$(inherited)"; 557 | SKIP_INSTALL = YES; 558 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 559 | }; 560 | name = Debug; 561 | }; 562 | DC087BB71B0CE5B500C95EBC /* Release */ = { 563 | isa = XCBuildConfiguration; 564 | buildSettings = { 565 | CLANG_ENABLE_MODULES = YES; 566 | DEFINES_MODULE = YES; 567 | DYLIB_COMPATIBILITY_VERSION = 1; 568 | DYLIB_CURRENT_VERSION = 1; 569 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 570 | FRAMEWORK_SEARCH_PATHS = ( 571 | "$(inherited)", 572 | "$(PROJECT_DIR)/Carthage/Build/iOS", 573 | ); 574 | INFOPLIST_FILE = Matryoshka/Info.plist; 575 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 576 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 577 | PRODUCT_NAME = "$(inherited)"; 578 | SKIP_INSTALL = YES; 579 | }; 580 | name = Release; 581 | }; 582 | DC087BB91B0CE5B500C95EBC /* Debug */ = { 583 | isa = XCBuildConfiguration; 584 | buildSettings = { 585 | FRAMEWORK_SEARCH_PATHS = ( 586 | "$(SDKROOT)/Developer/Library/Frameworks", 587 | "$(inherited)", 588 | ); 589 | GCC_PREPROCESSOR_DEFINITIONS = ( 590 | "DEBUG=1", 591 | "$(inherited)", 592 | ); 593 | INFOPLIST_FILE = MatryoshkaTests/Info.plist; 594 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 595 | PRODUCT_NAME = "$(inherited)Tests"; 596 | }; 597 | name = Debug; 598 | }; 599 | DC087BBA1B0CE5B500C95EBC /* Release */ = { 600 | isa = XCBuildConfiguration; 601 | buildSettings = { 602 | FRAMEWORK_SEARCH_PATHS = ( 603 | "$(SDKROOT)/Developer/Library/Frameworks", 604 | "$(inherited)", 605 | ); 606 | INFOPLIST_FILE = MatryoshkaTests/Info.plist; 607 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 608 | PRODUCT_NAME = "$(inherited)Tests"; 609 | }; 610 | name = Release; 611 | }; 612 | DC087BD41B0CE66A00C95EBC /* Debug */ = { 613 | isa = XCBuildConfiguration; 614 | buildSettings = { 615 | CLANG_ENABLE_MODULES = YES; 616 | COMBINE_HIDPI_IMAGES = YES; 617 | DEBUG_INFORMATION_FORMAT = dwarf; 618 | DEFINES_MODULE = YES; 619 | DYLIB_COMPATIBILITY_VERSION = 1; 620 | DYLIB_CURRENT_VERSION = 1; 621 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 622 | FRAMEWORK_SEARCH_PATHS = ( 623 | "$(inherited)", 624 | "$(PROJECT_DIR)/Carthage/Build/Mac", 625 | ); 626 | FRAMEWORK_VERSION = A; 627 | GCC_PREPROCESSOR_DEFINITIONS = ( 628 | "DEBUG=1", 629 | "$(inherited)", 630 | ); 631 | INFOPLIST_FILE = Matryoshka/Info.plist; 632 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 633 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 634 | PRODUCT_NAME = "$(inherited)"; 635 | SDKROOT = macosx; 636 | SKIP_INSTALL = YES; 637 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 638 | }; 639 | name = Debug; 640 | }; 641 | DC087BD51B0CE66A00C95EBC /* Release */ = { 642 | isa = XCBuildConfiguration; 643 | buildSettings = { 644 | CLANG_ENABLE_MODULES = YES; 645 | COMBINE_HIDPI_IMAGES = YES; 646 | DEFINES_MODULE = YES; 647 | DYLIB_COMPATIBILITY_VERSION = 1; 648 | DYLIB_CURRENT_VERSION = 1; 649 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 650 | FRAMEWORK_SEARCH_PATHS = ( 651 | "$(inherited)", 652 | "$(PROJECT_DIR)/Carthage/Build/Mac", 653 | ); 654 | FRAMEWORK_VERSION = A; 655 | INFOPLIST_FILE = Matryoshka/Info.plist; 656 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 657 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 658 | PRODUCT_NAME = "$(inherited)"; 659 | SDKROOT = macosx; 660 | SKIP_INSTALL = YES; 661 | }; 662 | name = Release; 663 | }; 664 | DC087BD71B0CE66A00C95EBC /* Debug */ = { 665 | isa = XCBuildConfiguration; 666 | buildSettings = { 667 | COMBINE_HIDPI_IMAGES = YES; 668 | DEBUG_INFORMATION_FORMAT = dwarf; 669 | FRAMEWORK_SEARCH_PATHS = ( 670 | "$(DEVELOPER_FRAMEWORKS_DIR)", 671 | "$(inherited)", 672 | ); 673 | GCC_PREPROCESSOR_DEFINITIONS = ( 674 | "DEBUG=1", 675 | "$(inherited)", 676 | ); 677 | INFOPLIST_FILE = MatryoshkaTests/Info.plist; 678 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 679 | MACOSX_DEPLOYMENT_TARGET = 10.10; 680 | PRODUCT_NAME = "$(inherited)Tests"; 681 | SDKROOT = macosx; 682 | }; 683 | name = Debug; 684 | }; 685 | DC087BD81B0CE66A00C95EBC /* Release */ = { 686 | isa = XCBuildConfiguration; 687 | buildSettings = { 688 | COMBINE_HIDPI_IMAGES = YES; 689 | FRAMEWORK_SEARCH_PATHS = ( 690 | "$(DEVELOPER_FRAMEWORKS_DIR)", 691 | "$(inherited)", 692 | ); 693 | INFOPLIST_FILE = MatryoshkaTests/Info.plist; 694 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 695 | MACOSX_DEPLOYMENT_TARGET = 10.10; 696 | PRODUCT_NAME = "$(inherited)Tests"; 697 | SDKROOT = macosx; 698 | }; 699 | name = Release; 700 | }; 701 | /* End XCBuildConfiguration section */ 702 | 703 | /* Begin XCConfigurationList section */ 704 | DC087B991B0CE5B500C95EBC /* Build configuration list for PBXProject "Matryoshka" */ = { 705 | isa = XCConfigurationList; 706 | buildConfigurations = ( 707 | DC087BB31B0CE5B500C95EBC /* Debug */, 708 | DC087BB41B0CE5B500C95EBC /* Release */, 709 | ); 710 | defaultConfigurationIsVisible = 0; 711 | defaultConfigurationName = Release; 712 | }; 713 | DC087BB51B0CE5B500C95EBC /* Build configuration list for PBXNativeTarget "Matryoshka-iOS" */ = { 714 | isa = XCConfigurationList; 715 | buildConfigurations = ( 716 | DC087BB61B0CE5B500C95EBC /* Debug */, 717 | DC087BB71B0CE5B500C95EBC /* Release */, 718 | ); 719 | defaultConfigurationIsVisible = 0; 720 | defaultConfigurationName = Release; 721 | }; 722 | DC087BB81B0CE5B500C95EBC /* Build configuration list for PBXNativeTarget "Matryoshka-iOSTests" */ = { 723 | isa = XCConfigurationList; 724 | buildConfigurations = ( 725 | DC087BB91B0CE5B500C95EBC /* Debug */, 726 | DC087BBA1B0CE5B500C95EBC /* Release */, 727 | ); 728 | defaultConfigurationIsVisible = 0; 729 | defaultConfigurationName = Release; 730 | }; 731 | DC087BD31B0CE66A00C95EBC /* Build configuration list for PBXNativeTarget "Matryoshka-Mac" */ = { 732 | isa = XCConfigurationList; 733 | buildConfigurations = ( 734 | DC087BD41B0CE66A00C95EBC /* Debug */, 735 | DC087BD51B0CE66A00C95EBC /* Release */, 736 | ); 737 | defaultConfigurationIsVisible = 0; 738 | defaultConfigurationName = Release; 739 | }; 740 | DC087BD61B0CE66A00C95EBC /* Build configuration list for PBXNativeTarget "Matryoshka-MacTests" */ = { 741 | isa = XCConfigurationList; 742 | buildConfigurations = ( 743 | DC087BD71B0CE66A00C95EBC /* Debug */, 744 | DC087BD81B0CE66A00C95EBC /* Release */, 745 | ); 746 | defaultConfigurationIsVisible = 0; 747 | defaultConfigurationName = Release; 748 | }; 749 | /* End XCConfigurationList section */ 750 | }; 751 | rootObject = DC087B961B0CE5B500C95EBC /* Project object */; 752 | } 753 | --------------------------------------------------------------------------------